反転
2010/01/06 20:57 - AS3.0
前回、グレイスケールで参照した "Foundation ActionScript 3.0 Image Effects" の同じく P106 に、ColorMatrixFilter を使った反転についての記述があります。
反転の際には ColorMatrixFilter の引数として以下の Array を使うとのこと。
このマトリクスは何をしているのでしょう? 詳細はライブヘルプに書いてありますが、一番上の行 [-1, 0, 0, 0, 255,] を例にとると、こんな感じ。
- 一列目の -1 は元の赤要素の値に -1 を掛ける
- 二列目の 0 は元の緑要素の値に 0 を掛ける
- 三番目の 0 は元の青要素の値に 0 を掛ける
- 四列目の 0 は元のアルファ値に 0 を掛ける
この4つの列で得られた値に、さらに五列目の値(ここでは 255)を足したものが、 ColorMatrixFilter で変換された後の赤要素になります。
そして、二番目の行は緑要素、三番目の行は青要素、四番目の行はアルファ値に対して、それぞれ同様の計算をしますよ、ってことですね。
getPixel を使って考えてみると、もっと直感的ですかねぇ。
このようにすると、ある一点のピクセルの色が取り出せますね。 ではその色を反転させるにはどうすれば良いのか?
色の三要素を分解して、それぞれの値を 0xFF から差し引けば良いんですよね。 そして得られた値をマージして、setPixel で置き換えれば、BitmapData の色は反転します。
setPixel と getPixel を使うと1ピクセルずつ処理をしなければいけませんが、ColorMatrixFilter を使うと、これを一気にガンっと処理してくれちゃうわけだ。
この negaR = 0xFF - r; という部分を negaR = r * -1 + 255; と書き換えると、先ほどの Array の中身もよく分かろうというものですね。
と、まぁ、このように ColorMatrixFilter を使って反転エフェクタのコードを組めるんですが、この前、もっとスマートなコードを「画像をネガに変換するコードを書いてみよう(ConvolutionFilter編)」(ActionScript入門Wiki@rsakane)というページで拝見したので、それを使わせてもらおうと思います。
それは ColorMatrixFilter の代わりに ConvolutionFilter を使うというものです。
なんとびっくり、ConvolutionFilter を使うと matrix として使用する Array の要素数がたったひとつで済んじゃいます。 コード全文は以下のとおり。
matrix の Array の要素は -1 ただひとつだけになっていますね。
先ほどの ColorMatrixFilter の matrix を考えると、これは左上から右下の対角線上を走る -1 と同じものであると推測できます。
じゃあ加算する 255 はどうなってんだ、というと、ConvolutionFilter の第5引数がそれに該当するとのことです。