【问题标题】:Resize and Create Thumbnail on Image Upload Django 2 using Pillow使用 Pillow 在图像上传 Django 2 上调整大小和创建缩略图
【发布时间】: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_thumbNone
  • @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


【解决方案1】:
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 试试这种方式

【讨论】:

  • img.thumbnail = output_size 是错误的。应该是img.thumbnail(output_size)。此外,您想保存在不同的路径,因为您想创建一个单独的缩略图文件,而不是修改原始文件。
  • 我的调整大小方法正在工作,除了保存测试图像的问题。这会解决这个问题吗?我没有看到我们的代码有太大区别。
  • 此方法将图片保存为指定大小
猜你喜欢
  • 2022-01-23
  • 2013-06-22
  • 2013-06-24
  • 2011-10-24
  • 2019-02-10
  • 2012-07-15
  • 1970-01-01
  • 2020-05-05
  • 2018-02-25
相关资源
最近更新 更多