使用Pillow在上传Django 2的图像上调整大小并创建缩略图



我正在尝试在上传时调整图像的大小,并用相同大小的图像创建缩略图。我以前可以调整图像的大小,但当我尝试添加缩略图功能时,我无法使其正常工作。我已经研究了所有其他相关的问题,所有这些问题要么已经过时,要么对我的情况不起作用。

型号.py

class Project(models.Model):
cover_image=models.ImageField(max_length=150, upload_to='project-covers/', default='Default.png', null=True)
thumbnail=models.ImageField(max_length=150, upload_to='project-thumbnails/', null=True)
def save(self, *args, **kwargs):
# pdb.set_trace()
if self.cover_image:
fname = self.title + '_cover.'
tname = self.title + '_thumbnail.'
self.resizeUploadedImage(fname)
self.createThumbnail(tname)
super(Project, self).save(*args, **
def resizeUploadedImage(self, fname):
'''Resize the image being uploaded.'''
try:
im = Image.open(self.cover_image)
if im.width > IMAGE_SIZE[0] or im.heght > IMAGE_SIZE[1]:
im.resize(IMAGE_SIZE, Image.ANTIALIAS)
image_io = BytesIO()
im.save(image_io, im.format)
# pdb.set_trace()
fname = fname + im.format
self.cover_image.save(fname, ContentFile(image_io.read(), False))
im.close()
image_io.close()
except IOError as e:
print("Could not resize image for", self.image)
print(e)
def createThumbnail(self, fname):
'''Create thumbnail of the image.'''
try:
if self.thumbnail is None:
im = Image.open(self.cover_image)
im.thumbnail(THUMB_SIZE)
image_io = BytesIO()
im.save(image_io, im.format)
fname = fname + im.format
self.thumbnail.save(fname, ContentFile(image_io.getvalue(), False))
im.close()
except IOError as e:
print('Could not create a thumbnail for', self.image)
print(e)

最初,我使用resizeUploadedImage和createThumbnail方法,并成功地调整了大小,但缩略图在我的管理页面和数据库中总是空的。之前我在缩略图上有"editable=False",因为我希望它在幕后自动创建。我认为这可能会阻止改变,所以我把它拿了出来,但它并没有改变结果。

然后我尝试将两者都移到save方法中(因为我之前在将调整大小移到save之外时遇到过问题(,但它仍然无法正常工作。

我在一些文档中看到,最好将super((调用放在save方法的末尾,但当我这样做时,我会得到

UNIQUE constraint failed: projects_project.id 

如何从cover_image中创建缩略图并将其保存到缩略图字段?

附言:在运行./manage.py test projects时,它似乎实际上是在将文件保存到我的磁盘上,我认为这不应该发生,所以我认为这是我的Pillow代码的某种问题。我最终得到了"1_cover.PNG"、"1Project0_cover.PNG","1Project 1_cover.PNG'"、"2_cover.PNG'等,等等,尽管我的setuptestdata只有"项目1",但它们的计数一直到9。

附言:我在某个地方读到,最好使用Pillow的缩略图功能来调整大小,因为它会保持纵横比,而调整大小则不会。有人对此有什么见解吗?

from PIL import Image
def save(self):
super().save()
img = Image.open(self.cover_image.path)
if img.height > 250 or img.width > 250:
output_size = (250, 250)
img.thumbnail(output_size)
img.save(self.cover_image.path)

试试你想要的尺寸,而不是250

最新更新