29

PNG画像に透明なアルファチャンネルがあるか、PILを使用していないかを検出する方法は?

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

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

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

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

4

5 に答える 5

56

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

于 2009-12-26T11:06:04.890 に答える
6

「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")
于 2009-12-26T11:10:48.783 に答える
4
# 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())
于 2009-12-26T11:05:21.940 に答える
4

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

于 2009-12-26T07:31:15.040 に答える
2

私はこれを試しました:

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())

これは私が期待していた結果を返しました。fx:meanしかし、平均値と標準偏差を求める計算を行ったところ、imagemagick の関数とは少し異なる結果が得られました。

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

于 2017-01-12T19:07:28.823 に答える