2012-07-14 18 views
5

透明な背景に白いアイコンのセットがあります。透明な背景にすべてを反転させたいと思います。Python:透明な背景を持つ反転イメージ(PIL、Gimp、...)

enter image description here

は、PIL(ImageChops)で試してみましたが、透明な背景で動作するようには思えません。私もGimpのPythonインターフェイスを試しましたが、そこには運がありません。

どのように反転がPythonでどのように達成されるのでしょうか?

+0

イメージはどのような形式ですか? – Acorn

+0

ファイル形式はpng – Hoff

答えて

5

ImageChops.invertも、各ピクセルのアルファチャンネルを逆転させるようです。

これは、ジョブ実行する必要があります。

import Image 

img = Image.open('image.png').convert('RGBA') 

r, g, b, a = img.split() 

def invert(image): 
    return image.point(lambda p: 255 - p) 

r, g, b = map(invert, (r, g, b)) 

img2 = Image.merge(img.mode, (r, g, b, a)) 

img2.save('image2.png') 
+0

独自の '' invert() ''を定義するのではなく、各チャンネルが '' L "'型を持っているので '' ImageOps.invert() ''を各チャンネルで使うことができます。 (または私は 'ImageChops.invert()'と思っていますが、自分自身でそれをテストしたことはありません)。 – Ray

1

を私はどんぐりのアプローチを試してみましたが、結果は(下の画像の上の部分)やや奇妙です。

enter image description here

下のアイコンは、私が本当に欲しかったものですが、私はImage Magick年代を使用することによって、それを達成する方法変換:

convert tools.png -negate tools_black.png

(それ自体はPythonのが、Pythonのラッパーが存在し、好きではないがPythonMagickWand

唯一の欠点は、ImageMagickを動作させるためにたくさんの依存関係をインストールする必要があることですが、強力なイメージマニフェストpulationフレームワーク。

+0

私が投稿したコードは、白いピクセルを黒に変換するだけでした。私はジェネリックインバージョンで私の答えを更新しました。 – Acorn

0

あなたはこのように、PILで非常に簡単にこれを行うことができます。

  1. 画像がconvert('RGBA')を使用することにより、RGBAとして表現されていることを確認します。
  2. イメージを別々のバンドに分割します。RGBAバンド。
  3. RGBバンドに何をしたいのですか(あなたの場合は、point関数を使用してすべてを黒に設定します)、アルファバンドには触れないでください。
  4. バンドをマージして戻します。

相続コード:

import Image 
im = Image.open('image.png') 
im = im.convert('RGBA') 
r, g, b, a = im.split() 
r = g = b = r.point(lambda i: 0) 
im = Image.merge('RGBA', (r, g, b, a)) 
im.save('saved.png') 

はそれに打撃を与えます。

0
import Image, numpy 
pixels = numpy.array(Image.open('myimage.png')) 
pixels[:,:,0:3] = 255 - pixels[:,:,0:3] # invert 
Image.fromarray(pixels).save('out.png') 

おそらく最も速い解決策です。これは、「各ピクセルごとに」ループ内のPythonコードを解釈しないためです。

関連する問題