Домой Графика C# Обработка изображений. Инвертируем картинку.: Справочник по C#

C# Обработка изображений. Инвертируем картинку.: Справочник по C#

453
0


      В данной статье хочу привести пример функции которая инвертирует цвета Bitmap'a. Для этого достаточно пройтись по каждому пикселю bitmapа и вычесть из 255 текущее значение состовляющей цвета.
      Этот пример настолько прост, что даже не важно, в каком порядке идут пиксели. Scan0 это указатель на данные. В нашей небезопасной блоке (unsafe) захватываем указатель, и рассчитываем новые значения пикселей. 

public static bool Invert(Bitmap b)
{
// GDI+ still lies to us - the return format is BGR, NOT RGB.
BitmapData bmData = b.LockBits(new Rectangle(0, 0, b.Width, b.Height),
ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
int stride = bmData.Stride;
System.IntPtr Scan0 = bmData.Scan0;
unsafe
{
byte * p = (byte *)(void *)Scan0;
int nOffset = stride - b.Width*3;
int nWidth = b.Width * 3;
for(int y=0;y < b.Height;++y)
{
for(int x=0; x < nWidth; ++x )
{
p[0] = (byte)(255-p[0]);
++p;
}
p += nOffset;
}
}

b.UnlockBits(bmData);

return true;
}

      Главное при обработке изображений сделать как можно больше действий вне цикла, конечно насколько это возможно. Изображение 1024×768, будет содержать 786 432 отдельных пикселей, что дает большие накладные расходы, если мы добавим вызов функции или создадим переменную внутри цикла. Вот, что должно получиться у вас:

Источник easylab.net.ua

ЧИТАТЬ ТАКЖЕ:  Заказываем пиццу на доставку: как выбрать ресторан?

C# Обработка изображений. Инвертируем картинку.: Справочник по C#

0.00 (0%) 0 votes

ОСТАВЬТЕ ОТВЕТ

Пожалуйста, введите ваш комментарий!
пожалуйста, введите ваше имя здесь