web-dev-qa-db-ja.com

PILを使用してPNG画像のアルファ値を取得するにはどうすればよいですか?

PNG画像に透明なアルファチャネルがあるかどうか、またはPILを使用していないかどうかを検出するにはどうすればよいですか?

img = Image.open('example.png', 'r')
has_alpha = img.mode == 'RGBA'

上記のコードで、PNG画像にアルファチャネルがあるかどうかはわかりますが、アルファ値を取得する方法はわかりますか?

PILのWebサイト で説明されているように、img.info辞書に「透明度」キーが見つかりませんでした

Ubuntuとzlib1gを使用していますが、zlibcパッケージはすでにインストールされています。

22
jack

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メソッドが必要です。

49
Nadia Alramli

「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")
5
Anurag Uniyal

img.infoは画像全体に関するものです。RGBA画像のアルファ値はピクセルごとであるため、もちろんimg.infoには含まれません。画像オブジェクトのgetpixelメソッドは、引数として座標を指定すると、そのピクセルの(この場合は4つの)バンドの値を持つタプルを返します。タプルの最後の値はAになり、アルファ値。

4
Alex Martelli
# 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())
4
tzot

私はこれを試しました:

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関数とはわずかに異なっていました。

おそらく、変換によっていくつかの値が変更されましたか?よくわかりませんが、比較的些細なことのようです。

1
Zhia Chong