异常类型:OSError异常值:无法将RGBA模式写入JPEG

时间:2018-10-05 22:41:48

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

我在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格式保存怎么办? 我的应用程序正在生产中。所以我只想为正确的工作推送正确的代码。请帮我弄清楚。

1 个答案:

答案 0 :(得分:0)

请向我解释为什么上传超过10张图片后出现此错误

A:有些图像处于RGBAP模式,不支持直接转换为JPG

说明:

摘要12

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

->您的位置: 因此您使用convert转换为PNG然后保存

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

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

A:不。

推荐使用:

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")