LoginSignup
3
2

More than 5 years have passed since last update.

FlashのColorMatrixFilterをImageMagickで再現する

Posted at

FlashにはColorMatrixFilterがあり、4x5の色変換行列でDisplayObjectにフィルタをかけることが出来ます。

ImageMagickにも同様に-color-matrixオプションで行列を指定して、色の置き換えができ、Flashと同じように変換することが出来ます。

Flashの行列

Flash側の行列は20個の要素の配列で表現され、次のように計算され新しい色が計算されます。

destR = (m[ 0] * srcR) + (m[ 1] * srcG) + (m[ 2] * srcB) + (m[ 3] * srcA) + m[ 4];
destG = (m[ 5] * srcR) + (m[ 6] * srcG) + (m[ 7] * srcB) + (m[ 8] * srcA) + m[ 9];
destB = (m[10] * srcR) + (m[11] * srcG) + (m[12] * srcB) + (m[13] * srcA) + m[14];
destA = (m[15] * srcR) + (m[16] * srcG) + (m[17] * srcB) + (m[18] * srcA) + m[19];

Flashの行列をImageMagickに移植する場合

ImageMagickではCYMKAも扱えるように6x6の行列に拡張されていますが、0と1で埋める、オフセットは255で割る、を行えばFlash同様の定義ができます。

m[0] m[1] m[2] m[3] 0 m[4] / 255
m[5] m[6] m[7] m[8] 0 m[9] / 255
m[10] m[11] m[12] m[13] 0 m[14] / 255
m[15] m[16] m[17] m[18] 0 m[19] / 255
0 0 0 0 1 0
0 0 0 0 0 1

コントラストを上げる場合、Flashでは以下のようになります。

var matrix:Array = [    2, 0, 0, 0, -128    ,
                        0, 2, 0, 0, -128    ,
                        0, 0, 2, 0, -128    ,
                        0, 0, 0, 1, 0       ];
image.filters = [new ColorMatrixFilter(matrix)];

これをImageMagickで再現するには、Flashの行列を以下のように変換します。

2,  0,  0,  0,  0,  -0.502,
0,  2,  0,  0,  0,  -0.502,
0,  0,  2,  0,  0,  -0.502,
0,  0,  0,  1,  0,       0,
0,  0,  0,  0,  1,       0,
0,  0,  0,  0,  0,       1,

そして以下のようなコマンドになります。

convert src.jpg -color-matrix "2 0 0 0 0 -0.502 0 2 0 0 0 -0.502 0 0 2 0 0 -0.502 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1" out.jpg
3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2