【问题标题】:Exception Type: OSError Exception Value: cannot write mode RGBA as JPEG异常类型:OSError 异常值:无法将模式 RGBA 写入 JPEG
【发布时间】:2018-10-05 22:41:48
【问题描述】:

我已经在我的 django 应用程序中借助以下代码上传了 10 多张图片(使用图片枕头库)。

def save(self):
    im = Image.open(self.image)
    output = BytesIO()
    im = im.resize((500, 500))

    im.save(output, format='JPEG', optimize=True, quality=95)
    output.seek(0)

    self.image = InMemoryUploadedFile(output, 'ImageField', "%s.jpg" % self.image.name.split('.')[0], 'image/jpeg',
                                      sys.getsizeof(output), None)

    super(Report_item, self).save()

但现在我的 Django 应用程序出现以下错误。

Exception Type: OSError
Exception Value:    
cannot write mode RGBA as JPEG

我从 StackOverflow 的一个答案中获得了解决方案,将图像类型从任何其他类型更改为 png。

现在我的代码看起来像这样,但与之前相比,这个过程似乎有点慢。

def save(self):
    im = Image.open(self.image)
    output = BytesIO()
    im = im.resize((500, 500))

    im.save(output, format='PNG', optimize=True, quality=95)
    output.seek(0)

    self.image = InMemoryUploadedFile(output, 'ImageField', "%s.png" % self.image.name.split('.')[0], 'image/jpeg',
                                      sys.getsizeof(output), None)

    super(Report_item, self).save()

现在图片正在上传,没有任何问题。

请向我解释为什么我在上传超过 10 张照片后出现了这个错误。 这是正确的方法吗。如果我想保存为 jpeg 格式怎么办? 我的应用程序正在生产中。所以我只想为正确的工作推送正确的代码。请帮我弄清楚。

【问题讨论】:

  • 我已经从那个答案中解决了这个问题。我正在寻找上传 10 多张照片后为什么会发生这种情况以及我的看法。这是正确的做法吗?
  • 该链接应该让 JPEG 再次为您工作,但至于为什么它突然停止工作,这可能是多种原因。我对 Django 了解不多,无法真正给你一个直接的答案,但我怀疑最近的更新可能会贬低你完成此任务的方式。 github.com/python-pillow/Pillow/issues/2609

标签: python django model django-forms python-imaging-library


【解决方案1】:

请解释一下为什么我上传了超过 10 张图片后出现了这个错误

A:有些图片是RGBAP模式,不支持直接转换成JPG

解释:

总结12

  • 背景
    • JPG不支持alpha = transparency
    • RGBA, Palpha = transparency
      • RGBA= Red Green Blue Alpha
  • 结果
    • cannot write mode RGBA as JPEG
    • cannot write mode P as JPEG
  • 解决方案
    • 在保存为 JPG 之前,丢弃alpha = transparency
      • 如:将Image转换为RGB
    • 然后保存到JPG

-> 你在这里: 所以你使用转换为PNG然后保存

im.save(output, format='PNG', optimize=True, quality=95)

这是正确的做法吗?如果我想保存为 jpeg 格式怎么办?

答:没有。

推荐使用:

rgba_or_p_im = original_im
if rgba_or_p_im.mode in ["RGBA", "P"]:
    rgb_im = rgba_or_p_im.convert("RGB")
    rgb_im.save("xxx.jpg")

【讨论】:

    猜你喜欢
    • 2018-06-23
    • 1970-01-01
    • 2021-12-26
    • 1970-01-01
    • 2020-06-15
    • 2016-10-24
    • 1970-01-01
    • 1970-01-01
    • 2021-10-08
    相关资源
    最近更新 更多