Почему загруженные изображения в моем проекте Django имеют больший размер файлов, чем исходные изображения? И как мне их сжать?

Я работаю над проектом, который получает в Django загруженное пользователем изображение из Javascript через fetch API. Пользователь загружает изображения для каждой плитки в пользовательской сетке.

Мне удалось заставить мое приложение работать, но я заметил, что загруженные изображения плиток (все в соотношении 1:1) имеют гораздо больший размер файлов, чем те, которые загружаются на самом деле. Почему так происходит?

Я использую cropper.js для обрезки и сохранения файлов на фронтенде. Интересно, может ли это повлиять на размер файлов таким образом?

Кроме того, как мне сжать изображения перед сохранением, чтобы сэкономить место в памяти? Я пробовал переопределить метод сохранения Pillow, как упоминалось в других сообщениях, но не смог заставить его работать. Вот часть моего кода:

Пониженная версия представления, которая получает и сохраняет изображение плитки:

def add_image(request, tile_id):
    #  Query for requested tile
    try:
        tile = Tile.objects.get(pk=tile_id)
    except Tile.DoesNotExist:
        return JsonResponse({"error": "Tile not found."}, status=404)

    if request.method == "POST":
        image = request.FILES.get("image")
        if image is not None:
            print(f"Image received: {image}")               
            # Add image to tile
            tile.image = image
            tile.save()
            tiles = Tile.objects.select_related("grid").filter(grid=grid).all()
            return JsonResponse({
                "tiles": [tile.serialize() for tile in tiles],
            }, safe=False)
        else:
            return JsonResponse({"error": "Image not added."}, status=404)
    else:
        return JsonResponse({
            "error": "POST request required."
        }, status=400)

Из models.py

class Tile(models.Model):
    timestamp = models.DateTimeField(default=timezone.now)
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="user_tiles")
    image = models.ImageField(upload_to=myproject/img, default="../static/myproject/default.svg")
Вернуться на верх