透明な背景に白いアイコンのセットがあり、それらをすべて反転して透明な背景に黒にします。
PIL(ImageChops)を試しましたが、透明な背景では機能しないようです。私もGimpのPythonインターフェースを試しましたが、運が悪かったです。
Pythonで反転が最もよく達成される方法はありますか?
透明な背景に白いアイコンのセットがあり、それらをすべて反転して透明な背景に黒にします。
PIL(ImageChops)を試しましたが、透明な背景では機能しないようです。私もGimpのPythonインターフェースを試しましたが、運が悪かったです。
Pythonで反転が最もよく達成される方法はありますか?
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')
Acorn のアプローチを試してみましたが、結果はやや奇妙です (下の画像の上部)。
一番下のアイコンは私が本当に欲しかったものです。Image Magickの convert メソッドを使用して実現しました。
convert tools.png -negate tools_black.png
(python 自体ではありませんが、PythonMagickWandのような python ラッパーが存在します。
唯一の欠点は、ImageMagick を機能させるために多数の依存関係をインストールする必要があることですが、これは強力な画像操作フレームワークのようです。
PIL
次のように、これを非常に簡単に行うことができます。
RGBA
を使用して、イメージが として表されていることを確認しconvert('RGBA')
ます。RGBA
画像を別々のバンドに分割します。RGB
します (この場合、関数を使用してすべてを黒に設定しますpoint
)。ただし、アルファ バンドには触れないでください。コードは次のとおりです。
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')
試してみます。
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 コードを解釈しないため、おそらくこれまでで最速のソリューションです。