使用Pillow将png转换为jpeg

89

我试图使用Pillow将PNG转换为JPEG。我尝试了几个脚本,但都没有成功。这两个脚本似乎对像这样的小型PNG图像有效。

enter image description here

第一个代码:

from PIL import Image
import os, sys

im = Image.open("Ba_b_do8mag_c6_big.png")
bg = Image.new("RGB", im.size, (255,255,255))
bg.paste(im,im)
bg.save("colors.jpg")

第二段代码:
image = Image.open('Ba_b_do8mag_c6_big.png')
bg = Image.new('RGBA',image.size,(255,255,255))
bg.paste(image,(0,0),image)
bg.save("test.jpg", quality=95)

但如果我试图转换这样一个更大的图像

我会得到

Traceback (most recent call last):
  File "png_converter.py", line 14in <module>
    bg.paste(image,(0,0),image)
  File "/usr/lib/python2.7/dist-packages/PIL/Image.py", line 1328in paste
    self.im.paste(im, box, mask.im) ValueError: bad transparency mask

我做错了什么?


你尝试过这个了吗? - Sangbok Lee
是的,我做了,这是第一个例子。 - alex
4个回答

162

1
但它正在将图像的白色背景变为白色。有没有办法解决? - lifeisshubh
11
@lifeisshubh 问:白色是否应该转化为黑色? - Anna
4
我对此笑得很厉害。@lifeisshubh,你是说“它正在将图像的白色背景变成黑色”吗? - Nathan majicvr.com
2
据我所记,这个问题已经得到解决。但是时间过去了这么久,我既没有当时工作所用的系统,也没有那段代码。时间会让事情逐渐消逝。 - lifeisshubh
这里的colors.jpg存储在特定的本地路径中,你能给我一个例子吗? - arun kumar
显示剩余5条评论

24

这张图片的问题不在于它的大小,而在于它不是RGB,特别是它是一种索引图像。

enter image description here

以下是我如何使用shell进行转换:

>>> from PIL import Image
>>> im = Image.open("Ba_b_do8mag_c6_big.png")
>>> im.mode
'P'
>>> im = im.convert('RGB')
>>> im.mode
'RGB'
>>> im.save('im_as_jpg.jpg', quality=95)

因此,在您的代码中添加对图像模式的检查:

if not im.mode == 'RGB':
  im = im.convert('RGB')

23

您可以将打开的图像转换为RGB,然后以任何格式保存。 代码如下:

```python image = Image.open('example.png') rgb_image = image.convert('RGB') rgb_image.save('example.jpg') ```
from PIL import Image
im = Image.open("image_path")
im.convert('RGB').save("image_name.jpg","JPEG") #this converts png image as jpeg

如果你想要自定义图像的尺寸,只需在打开图像时调整大小,就像这样:

im = Image.open("image_path").resize(x,y)

然后将其转换为RGB格式并保存。

你代码的问题在于你将png粘贴到RGB块中,并通过硬编码将其保存为jpeg格式。你实际上没有将png转换为jpeg。


所有的回答都很好,谢谢,但是你有任何压缩尺寸的想法吗? - alex
尝试在保存图像时使用 optimize=True 进行优化。 - Mani

3
如果您想同时进行转换和调整大小,请尝试以下方法:
from PIL import Image

img = i.open('3-D Tic-Tac-Toe (USA).png').resize((400,400)) # (x,y) pixels
img.convert("RGB").save('myimg.jpg')

就这样,您调整大小和转换后的图像将存储在相同的位置。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接