コード例はこんな感じ。
//RGBATのそれぞれの値をどのように変化させるかを配列に保持(RGB値を1/3にする)
float[][] gm = new float[][]{
new float[]{1/3f,1/3f,1/3f,0.0f,0.0f}, // R
new float[]{1/3f,1/3f,1/3f,0.0f,0.0f}, // G
new float[]{1/3f,1/3f,1/3f,0.0f,0.0f}, // B
new float[]{0.0f,0.0f,0.0f,1.0f,0.0f}, // A
new float[]{0.0f,0.0f,0.0f,0.0f,1.0f}}; // Three Translations
Bitmap bmp = new Bitmap(ctlPicture.Image);
ColorMatrix gcm = new ColorMatrix(gm);
using (ImageAttributes gia = new ImageAttributes())
using (Graphics g = Graphics.FromImage(bmp))
{
gia.SetColorMatrix(gcm, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);
g.DrawImage(bmp, new Rectangle(0, 0, bmp.Width, bmp.Height), 0, 0, bmp.Width, bmp.Height, GraphicsUnit.Pixel, gia);
ctlPicture.Image = bmp;
}
float[][] gm = new float[][]{
new float[]{1/3f,1/3f,1/3f,0.0f,0.0f}, // R
new float[]{1/3f,1/3f,1/3f,0.0f,0.0f}, // G
new float[]{1/3f,1/3f,1/3f,0.0f,0.0f}, // B
new float[]{0.0f,0.0f,0.0f,1.0f,0.0f}, // A
new float[]{0.0f,0.0f,0.0f,0.0f,1.0f}}; // Three Translations
Bitmap bmp = new Bitmap(ctlPicture.Image);
ColorMatrix gcm = new ColorMatrix(gm);
using (ImageAttributes gia = new ImageAttributes())
using (Graphics g = Graphics.FromImage(bmp))
{
gia.SetColorMatrix(gcm, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);
g.DrawImage(bmp, new Rectangle(0, 0, bmp.Width, bmp.Height), 0, 0, bmp.Width, bmp.Height, GraphicsUnit.Pixel, gia);
ctlPicture.Image = bmp;
}
この方式は、RGBAいずれかの要素のみを変換するということにいては汎用的であり、意外とよい方法といえそうです。
ちなみにこの方式では、約50ms程度で処理が終わります。一番遅い方式と比べると約14倍のパフォーマンスが出ています。
また、この3つの方式で生成される画像をファイルにbitmap形式で保存しても、同じデータにはなりませんでした。結果から、この方式は四捨五入していることがわかりました。ということで条件を合わせるために、他の方式も四捨五入しています。
1 件のコメント:
コメントを投稿