gpt4 book ai didi

django - 如何将 Pillow 图像对象保存到 Django ImageField?

转载 作者:行者123 更新时间:2023-12-04 03:43:08 25 4
gpt4 key购买 nike

拥有缩略图像的 Django 模型,例如:

class Thumb(models.Model):
thumb = models.ImageField(upload_to='uploads/thumb/', null=True, default=None)

该 View 生成一个带有 pillow 的缩略图。包,并将其保存在 Thumb 中例如,使用如下代码:
image.thumbnail((50, 50))
inst.thumb.save('thumb.jpg', ???)

正确的制作方法是什么 image inst.thumb.save 的数据在 ??? ?

我能够让下面的工作:
thumb_temp = NamedTemporaryFile()
image.save(thumb_temp, 'JPEG', quality=80)
thumb_temp.flush()
inst.thumb.save('thumb.jpg', File(thumb_temp))
thumb_temp.close() # Probably required to ensure temp file delete at close

但是为了将内部数据传递给 inst.thumb.save而写一个临时文件似乎相当笨拙。 ,所以我想知道是否有更优雅的方法来做到这一点。 Django class NamedTemporaryFile 的文档.

最佳答案

这是一个从 Model.ImageField 获取图像的工作示例(Python3,django 1.11) , 使用 PIL (Pillow) 对其执行调整大小操作,然后将生成的文件保存到同一个 ImageField。希望这应该很容易适应您必须对模型图像进行的任何处理。

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

IMAGE_WIDTH = 100
IMAGE_HEIGHT = 100

def resize_image(image_field, width=IMAGE_WIDTH, height=IMAGE_HEIGHT, name=None):
"""
Resizes an image from a Model.ImageField and returns a new image as a ContentFile
"""
img = Image.open(image_field)
if img.size[0] > width or img.size[1] > height:
new_img = img.resize((width, height))
buffer = BytesIO()
new_img.save(fp=buffer, format='JPEG')
return ContentFile(buffer.getvalue())

#assuming your Model instance is called `instance`
image_field = instance.image_field
img_name = 'my_image.jpg'
img_path = settings.MEDIA_ROOT + img_name

pillow_image = resize_image(
image_field,
width=IMAGE_WIDTH,
height=IMAGE_HEIGHT,
name=img_path)

image_field.save(img_name, InMemoryUploadedFile(
pillow_image, # file
None, # field_name
img_name, # file name
'image/jpeg', # content_type
pillow_image.tell, # size
None) # content_type_extra
)

关于django - 如何将 Pillow 图像对象保存到 Django ImageField?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32945292/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com