2004/06/23(水) [n年前の日記]
#4 [cg_tools] アルファチャンネルを持ったフルカラーpngを透明な部分を残したまま減色したいのだけど
アルファチャンネルを極力活用する方向で変換するには、どうしたらええねん。
◎ 事の発端 :
IEでは、アルファチャンネルを持ったpngを表示しようとすると、透明部分が正常に表示されない。そこで、インデックスカラー(256色以下)に減色した上で、透明色を指定しないといけない。つまり、gifと同じにしてやる必要が。しかし、通常の減色ツールを介してしまうと、せっかくアルファチャンネルという透明度の情報を持っていたのに、それらの部分は無視・廃棄されてしまう。
*1
さて。どうしよう。透明部分を、別の1色として扱いながら、減色してくれるツールがあればいいのだけど。そんなツール、あるのかしら。
◎ 使ってない色で塗っておくという手もあるけれど :
その場合、
_フリンジが発生しやすくなる
のであります。どこにも使ってない色 = 背景色にした際に透明部分と透明でない部分の境界の色が怪しくなってくる色、なわけで。せっかく元画像がアルファチャンネルを持ってるのだから、少しは活用したいところ。
◎ GIMPならイケるかも :
インデックスカラー化してみたら、結構いけた。しかし、GIMPの減色って、ディザにしなくて済みそうなところもディザにしてしまったりで。性能的にちと問題が。うーん。
◎ _Hints and tips specific to Imagemagick :
convert -type Palette hoge.png fuge.png で 8bit PNG に変換できるらしい。試してみた。…なんだかディザにしなくていいところがディザになってるような。しかもIEで表示したらあらゆる場所が透明になってる。何故。
◎ _pngquant :
_(via 海外フリーソフト紹介)
32bit-RGBAのpngを渡すと、そのまま256色で透明部分を持ったpngに変換してくれるらしい。素晴らしい。…と思ったのだけど甘かった。変換後の画像を見ると、なんだかよくわからないところがボコボコと透明になってる。減色処理結果自体は結構いい感じなのに。惜しい。あと少しなのに。うーん。
32bit-RGBAのpngを渡すと、そのまま256色で透明部分を持ったpngに変換してくれるらしい。素晴らしい。…と思ったのだけど甘かった。変換後の画像を見ると、なんだかよくわからないところがボコボコと透明になってる。減色処理結果自体は結構いい感じなのに。惜しい。あと少しなのに。うーん。
◎ _png24 png8 conversion, problems with win32 ie :
これか?
_-ordered-ditherの例らしい。 なるほど。この手法か。そういや、これで「半透明処理」と謳ってたのを、どこかで目にした記憶も。
-ordered-dither opacity 2x2 (or 3x3 or 4x4) or -random-threshold opacity 10% (or other small %)しかし、「opacity なんて指定はできない」と怒られるのだが。うーん。 _ここから始まるスレッド にも同じような記述が。うーん。
_-ordered-ditherの例らしい。 なるほど。この手法か。そういや、これで「半透明処理」と謳ってたのを、どこかで目にした記憶も。
◎ _Internal Matte Channel :
アルファチャンネルのみを取り出す方法が書いてあった。
convert drawn.png -channel matte -separate +matte matte.png取り出してみて、気がついた。convert で縮小した画像のアルファチャンネルは、元画像のアルファチャンネルを縮小したものとは随分と異なる結果になってる。これで -type palette を指定したのでは、異常なデータが出てきて当然。
◎ そもそもIEがPNGのアルファチャンネルに対応してくれてたら :
こんな苦労はしなくて済むわけで。トホホ。
◎ 妄想 :
pngからアルファチャンネルだけ画像として抜き出して保存。png画像はそのまま256色未満で減色。あくまで256色未満。1色分は透明色用に残しておく。アルファチャンネル画像を白黒2値画像に変換。減色済みのpng画像に含まれていない色を求め、アルファチャンネル画像をその色でpng画像に合成、かつ、色を1色増やす。増やした1色を透明色として指定して保存。というのはどうか。どうかと言われても。
*1: 背景色を「白」にして減色したら、人の白目や服の白い部分まで「白」になるし。背景色を「黒」にして行えば、黒目や輪郭線が「黒」になる。「白」あるいは「黒」を透明色指定すると、白目や黒目、服の白い部分、輪郭線なども透明になってしまう。
[ ツッコむ ]
以上です。