Pull to refresh

Быстрая манипуляция с System.Drawing.Bitmap

Reading time2 min
Views6.3K
Этот топик меня побудило написать статья о работе с 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).
      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.


Также с помощью них можно создавать негатив изображения, замена одного цвета на другой и т.п. операции.

Tags:
Hubs:
+13
Comments15

Articles