Этот топик меня побудило написать статья о работе с System.Drawing.Bitmap http://habrahabr.ru/blogs/net/60085/. Мне часто приходилось сталкиваться в коде с попиксельной обработкой изображений для типовых операций, в то время как в .NET есть классы ColorMatrix, ColorMap, ImageAttributes для некоторых видов преобразований изображений.
К примеру, для картинки размером 1024 x 768 следующий код, выполняющий преобразование к серому изображению, выполнился за 0,1 секунду на моей машине (Виртуальная машина (под Hyper-V) 4-ре ядра и 1Гб оперативки), и для картинки размером 360 x 480 время составило 0,03 секунды. (Прошу строго не судить код, который быстро набросал для этого топика — на форме два PictureBox и один Button).
«Затемнение» можно получить с помощью значений:
При желании/необходимости — можно указать все значения одновременно с помощью конструктора класса:
Также с помощью них можно создавать негатив изображения, замена одного цвета на другой и т.п. операции.
К примеру, для картинки размером 1024 x 768 следующий код, выполняющий преобразование к серому изображению, выполнился за 0,1 секунду на моей машине (Виртуальная машина (под Hyper-V) 4-ре ядра и 1Гб оперативки), и для картинки размером 360 x 480 время составило 0,03 секунды. (Прошу строго не судить код, который быстро набросал для этого топика — на форме два PictureBox и один Button).
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.
Также с помощью них можно создавать негатив изображения, замена одного цвета на другой и т.п. операции.