System.Drawing.Bitmapによる迅速な操作

このトピックは、System.Drawing.Bitmap http://habrahabr.ru/blogs/net/60085/の操作に関する記事を書くように促しました。 コードの一般的な操作ではピクセル単位の画像処理を頻繁に処理する必要がありましたが、.NETにはいくつかの種類の画像変換用のColorMatrix、ColorMap、ImageAttributesクラスがあります。

たとえば、1024 x 768のサイズの画像の場合、グレーの画像に変換する次のコードは、私のマシン(4コアと1 GBのRAMを備えた仮想マシン(Hyper-Vの下))で0.1秒で完了し、360の画像x 480時間は0.03秒でした。 (このトピック用にすばやくスケッチしたコードを厳密に判断しないようにお願いします。フォームには2つのPictureBoxと1つのボタンがあります)。
DateTime startTime = DateTime .Now;

ImageAttributes ia = new ImageAttributes();
ColorMatrix cm = new ColorMatrix();
cm.Matrix00 = cm.Matrix01 = cm.Matrix02 =
cm.Matrix10 = cm.Matrix11 = cm.Matrix12 =
cm.Matrix20 = cm.Matrix21 = cm.Matrix22 = 0.34f;

ia.SetColorMatrix(cm);

Bitmap bmp = new Bitmap (pictureBox1.Image);
Graphics g = Graphics .FromImage(bmp);

g.DrawImage(bmp, new Rectangle(0, 0, bmp.Width, bmp.Height), 0, 0, bmp.Width, bmp.Height, GraphicsUnit.Pixel, ia);

pictureBox2.Image = (Image)bmp;

button1.Text = ( DateTime .Now - startTime).TotalSeconds + " c." ;


* This source code was highlighted with Source Code Highlighter .


「調光」は、次の値を使用して取得できます。

cm.Matrix00 = cm.Matrix11 = cm.Matrix22 = 0;
cm.Matrix33 = 0.25f;


* This source code was highlighted with Source Code Highlighter .


必要に応じて、クラスコンストラクターを使用してすべての値を同時に指定できます。
ColorMatrix cm = new ColorMatrix( new float [][]
{
new float [] { 0, 0, 0, 0, 0},
new float [] { 0, 0, 0, 0, 0},
new float [] { 0, 0, 0, 0, 0},
new float [] { 0, 0, 0, 0.25f, 0},
new float [] { 0, 0, 0, 0, 0},
});


* This source code was highlighted with Source Code Highlighter .


また、それらを使用して、ネガ画像を作成したり、ある色を別の色に置き換えたりすることができます。 操作。

Source: https://habr.com/ru/post/J60175/


All Articles