web-dev-qa-db-ja.com

PIL透明度のあるPNGまたはGIFをなしのJPGに変換します

Python 2.7でPIL1.1.7を使用して画像プロセッサのプロトタイプを作成していますが、すべての画像をJPGで表示したいと思います。入力ファイルの種類には、透明度ありとなしの両方でtiff、gif、pngが含まれます。 。私が見つけた2つのスクリプトを組み合わせようとしています。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:Bad TransparencyMaskが発生します。

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を削除できると思いますが、エレガントな解決策があることを願っています私はまだ見つけていません。

RGBAではなく、背景RGBを作成します。もちろん、背景が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")
30
kindall
image=Image.open('file.png')
non_transparent=Image.new('RGBA',image.size,(255,255,255,255))
non_transparent.paste(image,(0,0),image)

重要なのは、マスク(貼り付け用)を画像自体にすることです。

これは、「ソフトエッジ」(アルファ透明度が0または255ではないように設定されている)を持つ画像で機能するはずです。

7
Chander

以下は this image で私のために働きます

f, e = os.path.splitext(infile)
print infile
outfile = f + ".jpg"
if infile != outfile:
    im = Image.open(infile)
    im.convert('RGB').save(outfile, 'JPEG')
4
uncreative