中井技術工房  VC/MFC による PNG画像変換
αチャンネルの取扱い Feb.02,2010


トップ > PNG画像変換トップ > ここ

αチャンネルの取扱い

ここではVC++ などで PNG ファイル読込みプログラムを作成するときに問題になるαチャンネルをどのように取り扱ったらよいかのガイダンスを示します。
なお、サンプル画像は次の HP からサンプリングさせていただきました。

Django's House 透過画像を作ろう(http://www.kuronowish.com/~django/photo/RetuchRoom.html)


αチャンネルと透過画像

αチャンネルとは、ドットごとに背景が透けて見える度合いを8ビット(0-255)で表現したものです。

0 -- 100% 背景が見え、画像ドットは見えない。
255 -- 全部画像ドットが見える

途中のドットは、次のようになります。

   R 表示値 = R 画像値 * α/255 + R 背景 * (255-α)/255
   G, B も同じ計算



カラータイプとbit-depth(ビット深度)

[ サンプル ]



PNG ファイルのヘッダ部(IHDR に続くデータ)に、カラータイプと bit-depth というデータがあります。
右側は対応する画像です。

[ カラータイプと bit-depth の組み合わせ ]

いろいろな組み合わせがありますが、とりあえず、見つけた画像のデータだけ、ソフトで対応することにしました。

カラー
タイプ
bit-depth
ドットデータ
2
8
それぞれのピクセルはR, G, B の3バイト
3
8
それぞれのピクセルはパレットインデックスを示す。
そのため PLTE チャンクが必要。
tRNS チャンクがあれば、パレットに連動してα値を示す。
6
8
それぞれのピクセルはR, G, B の3バイトと A (=α値)の1バイト
6
16
それぞれのピクセルはR, G, B の6バイトとA (=α値)の1バイト
画像がないので検証できていない



αの影響

[ カラータイプ3のとき=8ビットサンプル ]

元PNG画像
α補正なし
bmp
α補正あり
bmp

α補正をすると、元の PNG の透過特性を正しく表現でき、補正しないと背景部分が元データのまま(本例では黒)になってしまいます。
なお、昔ながらのBMP(Microsoft Windows DIB) にはこの機能がありませんので、背景を 255=白として補正して変換しました。
(最近はこの機能が含まれる BMP も出てきているが、今のところ例外的)


[ カラータイプ6のとき=8ビットサンプル ]

全体にα補正を半分かけた半透明の元画像です。

元PNG画像
α補正なし
bmp
α補正あり
bmp

α補正をすると、元の PNG の透過特性を正しく表現でき、補正しないと透過機能が無視されて、くっきり表現されてしまいます。


αデータの読出し

[ カラータイプ6のとき=RGB の後ろにくっついている ]

カラータイプのときは、α値がドットごとにくっついています。補正をすると、元の PNG の透過特性を正しく表現でき、補正しないと透過機能が無視されて、くっきり表現されてしまいます。


[ カラータイプ3のとき=PLTE,tRNS データの読出し ]

パレットデータ(PLTE)とそれに続く tRNSデータを読み出して、ピクセルデータ→パレット該当 RGB 取得→対応するtRNS データ=αを取得して補正、という手順を繰り返す必要があります。
変換プログラムのソースを参照ください。



トップ > PNG画像変換トップ > 頁トップ