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