【发布时间】:2020-03-10 05:18:43
【问题描述】:
我正在尝试在上传时调整图像大小,并使用相同大小的图像创建缩略图。我以前能够毫无问题地调整图像大小,但是,当我尝试添加缩略图功能时,我无法让它工作。我查看了所有其他相关问题,所有这些问题要么已经过时,要么在我的情况下没有用。
models.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”之前,因为我希望它在幕后自动创建。我认为这可能会阻止更改,所以我将其取出,但它并没有改变结果。
然后我尝试将两者都移到保存方法中(因为我之前在将调整大小移到保存之外时遇到了问题),但它仍然无法正常工作。
我在几个文档中看到最好将 super() 调用放在 save 方法的末尾,但是当我这样做时,我得到了
UNIQUE constraint failed: projects_project.id
如何从cover_image 创建缩略图并将其保存到缩略图字段?
附:在运行./manage.py test projects 时,它似乎实际上是在将文件保存到我的磁盘上,我认为这是不应该发生的,所以我认为我的 Pillow 代码存在某种问题。我最终得到 '1_cover.PNG'、'1Project0_cover.PNG'、'1Project1_cover.PNG'、'2_cover.PNG' 等等等等,即使我的 setuptestdata 只有 'Project 1',也计数到 9。
P.P.S.我在某处读到最好使用 Pillow 的缩略图功能来调整大小,因为它会保持纵横比,而调整大小不会。有人对此有任何见解吗?
【问题讨论】:
-
Image.thumbnail()返回None记录在here 所以你的im_thumb是None。 -
@ger.s.brett 不幸的是,这个问题与函数视图有关,而我使用的是类视图。除此之外,海报的问题是关于在他需要添加字段的地方添加额外的图像。我已经准备好一个字段,只需要在使用基于 CLASS 的视图时转换图像并存储值。通读 Python 3 的公认答案,我们的代码似乎非常相似,我不确定我错过了什么。
-
@dirkgroten 我已经能够在 django shell 中完成这个过程。我使用了相同的代码并验证了 im_thumb 确实有一个大小合适的图像。
-
@Zoneo 那是不可能的。正如我在链接中向您展示的那样,
thumbnail()方法在适当位置创建缩略图并且不返回任何内容(即im.thumbnail(THUMB_SIZE)实际上使im缩略图)因此您应该将im保存在正确的位置以获取你的缩略图。如果您查看 ger.s.brett 给出的答案,您还会看到:image.thumbnail(THUMB_SIZE, Image.ANTIALIAS),然后是image.save(...)。
标签: python django python-imaging-library