PIL将具有透明度的PNG或GIF转换为JPG,而无需
image-processing
python
python-imaging-library
6
0

我正在使用PIL1.1.7在Python 2.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

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

参考资料:
Stack Overflow
收藏
评论
共 3 个回答
高赞 时间 活跃
image=Image.open('file.png')
non_transparent=Image.new('RGBA',image.size,(255,255,255,255))
non_transparent.paste(image,(0,0),image)

关键是使遮罩(用于粘贴)成为图像本身。

这应该适用于具有“柔和边缘”(alpha透明度设置为不为0或255)的图像

收藏
评论

使背景为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")
收藏
评论

以下对我有用的这张图片

f, e = os.path.splitext(infile)
print infile
outfile = f + ".jpg"
if infile != outfile:
    im = Image.open(infile)
    im.convert('RGB').save(outfile, 'JPEG')
收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号