Python 拍摄图像后保存为PNG(使用PIL库)。两个PNG文件的不同之处在于生成透明(或白色)PNG图像文件

Python 拍摄图像后保存为PNG(使用PIL库)。两个PNG文件的不同之处在于生成透明(或白色)PNG图像文件,python,image,png,python-imaging-library,Python,Image,Png,Python Imaging Library,在这段代码中,我对两个分辨率相同的PNG图像进行了差异处理,然后保存差异,。在JPEG中保存效果很好,但在PNG中,它会生成一个完整的PNG图像文件。请看最后两行中的注释 import Image import ImageChops js_black_im = Image.open("/js_black.png") js_white_im = Image.open("/fb_white.png") diff_im = ImageChops.difference(js_black_im, js_w

在这段代码中,我对两个分辨率相同的PNG图像进行了差异处理,然后保存差异,。在JPEG中保存效果很好,但在PNG中,它会生成一个完整的PNG图像文件。请看最后两行中的注释

import Image
import ImageChops
js_black_im = Image.open("/js_black.png")
js_white_im = Image.open("/fb_white.png")
diff_im = ImageChops.difference(js_black_im, js_white_im)
diff_im.save("/js_onlytext.jpeg", "JPEG") #this works as expected
diff_im.save("/js_onlytext.png", "PNG") #this produces a total tranparent PNG image file![js_black.png][1]![fb_black.png][2]

也许您的原始图像有一个alpha通道(RGBA),您应该事先知道,和/或检查image.open生成的图像类型的结果(查看
image.mode
image.info
)。无论如何,您可以在执行差异之前或之后通过调用
.convert('RGB')
强制RGB类型(无alpha通道)。

也许您的原始图像有一个alpha通道(RGBA),您应该事先知道,和/或检查image.open生成的图像类型的结果(查看
Image.mode
Image.info
)。无论如何,您可以通过调用
.convert('RGB')
,在进行差异之前或之后强制RGB类型(无alpha通道)。

原始图像有alpha通道?原始图像是网页(facebook登录页)的屏幕截图通过selenium拍摄。我不知道他们是否有alpha通道。请尝试添加一个
convert('RGB')
,例如
ImageChops.difference(js_black\u im,js_white\u im)。convert('RGB'))
是的,它现在可以工作了。这就是答案。您能解释一下为什么它在转换为RGB之前生成了透明的PNG,但在转换为RGB之后生成了预期的图像原始图像有一个alpha通道吗?原始图像是网页的截图(facebook登录页面)通过selenium拍摄。我不知道他们是否有alpha通道。请尝试添加一个
convert('RGB')
,例如
ImageChops.difference(js_black\u im,js_white\u im)。convert('RGB'))
是的,它现在可以工作了。这就是答案。你能解释一下为什么它在转换为RGB之前生成了透明的PNG,但在转换为RGB之后,它生成了预期的图像是的,它的RGBA和差异也是RGBA,那么为什么我们需要将RGBA与RGB进行差异,以使其按预期显示而不透明?如果orig最终图像是RGBA,它们有一个alpha通道;假设它们是完全不透明的,那么所有像素的alpha=255。当你做差分时,PIL也减去该通道,所以你得到alpha=0,这意味着完全透明(至少我猜是这样)是的,它是RGBA,差异也是RGBA,那么为什么我们需要强制将RGBA与RGB进行差异,以使其按预期显示且不透明?如果原始图像是RGBA,它们有一个alpha通道;假设它们是完全不透明的,则所有像素的alpha=255。进行差异时,PIL也会减去该通道,因此获取alpha=0,这意味着完全透明(至少我猜是这样)