Django преобразовывает TIFF в JPEG с подушкой - PullRequest
0 голосов
/ 15 декабря 2018

Я работаю с Django в Python 3, и у меня есть модель с ImageField, и я пытаюсь переопределить .save(), чтобы сделать преобразование TIFF в JPEG:

from PIL import Image
from io import BytesIO
from django.core.files.base import ContentFile

class MyModel(models.Model):

    image = models.ImageField(upload_to=upload_image_to, editable=True, null=True, blank=True)


    def save(self, *args, **kwargs):
        pil_image_obj = Image.open(self.image)
        new_image_io = BytesIO()
        rgb_pil_image_obj = pil_image_obj.convert("RGB")
        rgb_pil_image_obj.save(new_image_io, quality=90, format='JPEG')

        # temp_name = self.image.name
        # self.image.delete(save=False)

        # self.image.save(
        #     temp_name,
        #     content=ContentFile(new_image_io.getvalue()),
        #     save=False
        # )

        super().save(*args, **kwargs)

Однако это приводит к:

tempfile.tif: Cannot read TIFF header.
*** OSError: -2

Если я попробую эксперимент с сохранением, но открою только файл TIFF с диска вместо подачи PIL.Image с помощью Django InMemoryUploadedFile, то все будет работать абсолютно нормально.преобразуется в формате JPEG.

Также pil_image_obj.verify() не выдает никаких исключений.

Я использую Pillow==5.3.0

В чем может быть проблема?И есть ли другой способ сделать такое преобразование?

1 Ответ

0 голосов
/ 15 декабря 2018

Вам необходимо передать путь к файлу изображения в Image.open().В настоящее время вы проходите само поле.

pil_image_obj = Image.open(self.image.path)  # Pass the path
...