透明度付き画像の入れ替え不具合

swfed で SWF 内の画像を透明度付き PNG 画像で差し替えるとおかしな色が混じる件ですが、
仕様書の中に以下の記述を発見。

           BitmapPixelData ARGB[image data size]
Array of pixel colors.
Number of entries is BitmapWidth * BitmapHeight.
The RGB data must already be multiplied by the alpha channel value.

Flash CS3 とかで画像を放り込むと透明な場所の RGB 値に変化があったのはそういう事か…
予め alpha 値分減らして RGB 値を保存しておけば、実行時の色の重ね合わせで処理を省けますしね。

問題の説明

まとめると、以下のような感じ

  • 実行時の色の重ね合わせ処理を軽くする為、予め alpha 分 RGB 値を減らすのが本来の仕様。(計算式からの推測)
  • ところが、減らさずに PNG データの RGB 値をそのまま Lossless2 に埋め込んでいた。(不具合)
  • その為、色の重ね合わせで RGB 値が大きくなりすぎ 255 を超え、2 の補数でひっくり返って、ネガっぽい色が表示された。(前半は憶測)
  • ただし、alpha = 0 の時だけその色を足さない処理になっていて(憶測) そこだけ透明度が働いて輪郭の外側の背景が見えていた。 (なので alpha を 0 と 255 の2値表現で利用する場合は問題が発生しない *1 )

すっきり。(´∀`)

*1:…と思ってたけど、微妙におかしいとの報告も貰っているので要研究。