PNG画像に透明なアルファチャネルがあるかどうか、またはPILを使用していないかどうかを検出するにはどうすればよいですか?
img = Image.open('example.png', 'r')
has_alpha = img.mode == 'RGBA'
上記のコードで、PNG画像にアルファチャネルがあるかどうかはわかりますが、アルファ値を取得する方法はわかりますか?
PILのWebサイト で説明されているように、img.info辞書に「透明度」キーが見つかりませんでした
Ubuntuとzlib1gを使用していますが、zlibcパッケージはすでにインストールされています。
RGBA画像のアルファレイヤーを取得するには、次のことを行う必要があります。
red, green, blue, alpha = img.split()
または
alpha = img.split()[-1]
そして、アルファレイヤーを設定する方法があります:
img.putalpha(alpha)
透明度キーは、パレットモード(P)で透明度インデックスを定義するためにのみ使用されます。パレットモードの透明度のケースもカバーし、すべてのケースをカバーしたい場合は、これを行うことができます
if img.mode in ('RGBA', 'LA') or (img.mode == 'P' and 'transparency' in img.info):
alpha = img.convert('RGBA').split()[-1]
注:PILのバグのため、image.modeがLAの場合、convertメソッドが必要です。
「A」モードで画像を文字列に変換することで、画像全体からアルファデータを一度に取得できます。たとえば、この例では、画像からアルファデータを取得し、グレースケール画像として保存します:)
from PIL import Image
imFile="white-arrow.png"
im = Image.open(imFile, 'r')
print im.mode == 'RGBA'
rgbData = im.tostring("raw", "RGB")
print len(rgbData)
alphaData = im.tostring("raw", "A")
print len(alphaData)
alphaImage = Image.fromstring("L", im.size, alphaData)
alphaImage.save(imFile+".alpha.png")
img.info
は画像全体に関するものです。RGBA画像のアルファ値はピクセルごとであるため、もちろんimg.info
には含まれません。画像オブジェクトのgetpixel
メソッドは、引数として座標を指定すると、そのピクセルの(この場合は4つの)バンドの値を持つタプルを返します。タプルの最後の値はAになり、アルファ値。
# python 2.6+
import operator, itertools
def get_alpha_channel(image):
"Return the alpha channel as a sequence of values"
# first, which band is the alpha channel?
try:
alpha_index= image.getbands().index('A')
except ValueError:
return None # no alpha channel, presumably
alpha_getter= operator.itemgetter(alpha_index)
return itertools.imap(alpha_getter, image.getdata())
私はこれを試しました:
from PIL import Image
import operator, itertools
def get_alpha_channel(image):
try:
alpha_index = image.getbands().index('A')
except ValueError:
# no alpha channel, so convert to RGBA
image = image.convert('RGBA')
alpha_index = image.getbands().index('A')
alpha_getter = operator.itemgetter(alpha_index)
return itertools.imap(alpha_getter, image.getdata())
これは私が期待していた結果を返しました。しかし、平均と標準偏差を決定するためにいくつかの計算を行ったところ、結果はimagemagickのfx:mean
関数とはわずかに異なっていました。
おそらく、変換によっていくつかの値が変更されましたか?よくわかりませんが、比較的些細なことのようです。