5

透明な背景に白いアイコンのセットがあり、それらをすべて反転して透明な背景に黒にします。

ここに画像の説明を入力してください

PIL(ImageChops)を試しましたが、透明な背景では機能しないようです。私もGimpのPythonインターフェースを試しましたが、運が悪かったです。

Pythonで反転が最もよく達成される方法はありますか?

4

4 に答える 4

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')
于 2012-07-14T14:27:52.537 に答える
1

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

ここに画像の説明を入力

一番下のアイコンは私が本当に欲しかったものです。Image Magickの convert メソッドを使用して実現しました。

convert tools.png -negate tools_black.png

(python 自体ではありませんが、PythonMagickWandのような python ラッパーが存在します。

唯一の欠点は、ImageMagick を機能させるために多数の依存関係をインストールする必要があることですが、これは強力な画像操作フレームワークのようです。

于 2012-07-14T15:33:34.870 に答える
0

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

  1. RGBAを使用して、イメージが として表されていることを確認しconvert('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')

試してみます。

于 2012-07-14T19:27:06.390 に答える
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 コードを解釈しないため、おそらくこれまでで最速のソリューションです。

于 2012-07-15T11:29:59.297 に答える