使用PIL/Pillow打开PNG文件

16

我在尝试使用Python中的PIL/Pillow来打开一个PNG格式的图片。你可能认为这是微不足道的,但实际上图片显示出现了损坏。

这是一个示例图片:

我使用Python 3.4和Pillow 2.7.0来加载和展示它,但似乎并没有成功:

$ python
Python 3.4.0 (v3.4.0:04f714765c13, Mar 16 2014, 19:25:23) [MSC v.1600 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import PIL.Image
>>> image = PIL.Image.open(r'C:\Users\Administrator\Dropbox\Desktop\example.png')
>>> image.show()
>>>

我看到的显示结果如下:

有人知道为什么会这样,以及如何解决吗?(这种损坏不仅在我显示时发生,而且在我尝试将其粘贴到另一张图片中时也会发生,这是我的原始需求。)

2个回答

9

正如@wiredfool所说,图像在显示之前被转换为RGB格式。不幸的是,这意味着alpha通道被简单地丢弃了。您需要进行自己的转换,将图像与白色背景混合。

Image.composite(image, Image.new('RGB', image.size, 'white'), image).show()

paste的文档显示它也会忽略alpha通道。您需要在两个位置指定图像,一个用于源,一个用于掩码。

base.paste(image, box, image)

我不仅在 .show() 中看到图像出现损坏,而且当我将其通过 image.paste 粘贴到另一张图片中时,它也会以完全相同的视觉方式损坏。 - Ram Rachum
@RamRachum 如果你要粘贴的图像不是 RGBA 模式,则在粘贴之前进行 convert 转换。 - Mark Ransom

4

Image.show() 方法会将图像以 BMP 格式写入(Windows 系统),然后使用查看器打开。不幸的是,BMP 写入器不会保留 Alpha 通道,因此您只能查看图像的 RGB 通道。


我曾经看到过图像不仅在.show()中出现损坏,而且当我把它通过image.paste粘贴到另一张图像中时也是一样的损坏。从视觉上来看,它是以完全相同的方式损坏的。 - Ram Rachum
Image.paste在alpha方面的API有些奇怪。如果你传入一个掩码,它将使用该掩码来选择要粘贴到图像中的内容。Image.alpha_composite可能是你想要的。 - wiredfool

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