Python PIL将带有透明度的PNG或GIF转换为不带透明度的JPG

Python PIL将带有透明度的PNG或GIF转换为不带透明度的JPG,python,image-processing,python-imaging-library,Python,Image Processing,Python Imaging Library,我正在使用PIL1.1.7在Python2.7中原型化一个图像处理器,我希望所有的图像最终都是JPG。输入文件类型将包括tiff、gif、png,包括透明和不透明。我一直在尝试合并我发现的两个脚本1。将其他文件类型转换为JPG和2。通过创建空白白色图像并将原始图像粘贴到白色背景上来移除透明度。我的搜索被垃圾群发,人们寻求产生或保持透明度,而不是相反 我目前正在处理以下问题: #!/usr/bin/python import os, glob import Image images = glob

我正在使用PIL1.1.7在Python2.7中原型化一个图像处理器,我希望所有的图像最终都是JPG。输入文件类型将包括tiff、gif、png,包括透明和不透明。我一直在尝试合并我发现的两个脚本1。将其他文件类型转换为JPG和2。通过创建空白白色图像并将原始图像粘贴到白色背景上来移除透明度。我的搜索被垃圾群发,人们寻求产生或保持透明度,而不是相反

我目前正在处理以下问题:

#!/usr/bin/python
import os, glob
import Image

images = glob.glob("*.png")+glob.glob("*.gif")

for infile in images:
    f, e = os.path.splitext(infile)
    outfile = f + ".jpg"
    if infile != outfile:
        #try:
        im = Image.open(infile)
        # Create a new image with a solid color
        background = Image.new('RGBA', im.size, (255, 255, 255))
        # Paste the image on top of the background
        background.paste(im, im)
        #I suspect that the problem is the line below
        im = background.convert('RGB').convert('P', palette=Image.ADAPTIVE)
        im.save(outfile)
        #except IOError:
           # print "cannot convert", infile
这两个脚本都是独立工作的,但当我将它们组合在一起时,我得到了一个ValueError:糟糕的透明度掩码

Traceback (most recent call last):
File "pilhello.py", line 17, in <module>
background.paste(im, im)
File "/usr/lib/python2.7/dist-packages/PIL/Image.py", line 1101, in paste
self.im.paste(im, box, mask.im)
ValueError: bad transparency mask
回溯(最近一次呼叫最后一次):
文件“pilhello.py”,第17行,在
背景。粘贴(即时消息,即时消息)
文件“/usr/lib/python2.7/dist packages/PIL/Image.py”,第1101行,粘贴
self.im.paste(im、box、mask.im)
ValueError:错误的透明度掩码

我怀疑如果我要保存一个没有透明度的PNG,那么我可以打开这个新文件,并将其重新保存为JPG,然后删除写入磁盘的PNG,但我希望有一个优雅的解决方案,我还没有找到。

以下内容适合我


使您的背景为RGB,而不是RGBA。当然,还需要删除背景到RGB的后期转换,因为它已经处于该模式。我创建了一个测试图像,这对我很有用:

from PIL import Image
im = Image.open(r"C:\jk.png")
bg = Image.new("RGB", im.size, (255,255,255))
bg.paste(im,im)
bg.save(r"C:\jk2.jpg")
关键是使遮罩(用于粘贴)成为图像本身


这应该适用于那些具有“软边”(alpha透明度设置为不为0或255)的图像。

当代码在
.paste()上呕吐时,为什么会出现“下面的一行”问题,甚至没有到达该行?这个问题稍后才出现,但有所有答案:我一开始尝试了这种方法。直接转换到RGB模式对硬边遮罩有效,但软边遮罩可能会失败。你能提供一个链接到失败的图像吗?我可以看看我能不能把它用在我做的游戏上。如果只是剥离alpha通道。它出现故障,我能做些什么来修复它?我认为行bg.paste(im,im)需要是bg.paste(im,mask=im)得到了“***ValueError:bad transparency mask”,对于mask=im,使用上面的解决方案仍然会得到“***ValueError:bad transparency mask”。不确定为什么会迟到,但请尝试
bg.paste(im,mask=im.split()[3])
from PIL import Image
im = Image.open(r"C:\jk.png")
bg = Image.new("RGB", im.size, (255,255,255))
bg.paste(im,im)
bg.save(r"C:\jk2.jpg")
image=Image.open('file.png')
non_transparent=Image.new('RGBA',image.size,(255,255,255,255))
non_transparent.paste(image,(0,0),image)