Я работаю с 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
В чем может быть проблема?И есть ли другой способ сделать такое преобразование?