Метод Lockbits

Метод Lockbits

В .NET Compact Framework 2.0 появилась ограниченная поддержка метода LockBits, при помощи которого можно манипулировать массивом пикселов изображения. Перечисление ImageLockMode в данном методе позволяет использовать значения ReadWrite, ReadOnly и WriteOnly. А перечисление PixelFormat поддерживает значения, перечисленные в следующем списке:

? Format16bppRgb555;

? Format16bppRgb565;

? Format24bppRgb;

? Format32bppRgb.

На сайте MSDN можно найти статью «How to: Use LockBits» с примером, в котором создается картинка и меняется интенсивность синих пикселов с помощью метода LockBits. В листинге 6.21 приведен пример, который для большей наглядности пришлось немного изменить.

Листинг 6.21

private Bitmap CreateBitmap(int width, int height) {

 Bitmap bmp = new Bitmap(@"Windowsmsn.gif");

 width = bmp.Size.Width;

 height = bmp.Size.Height;

 Graphics g = Graphics.FromImage(bmp);

 g.Dispose();

 return bmp;

}

protected override void OnPaint(PaintEventArgs e) {

 Bitmap bmp = CreateBitmap(100, 100);

 // Выводим картинку-оригинал

 e.Graphics.DrawImage(bmp, 0, 0);

 MakeMoreBlue(bmp);

 // Рисуем модифицированную картинку ниже исходного изображения

 e.Graphics.DrawImage(bmp, 0, 50);

 bmp.Dispose();

}

private void MakeMoreBlue(Bitmap bmp) {

 // Задаём формат данных о цвете для каждой точки изображения

 PixelFormat pxf = PixelFormat.Format24bppRgb;

 // Блокируем изображение в памяти

 Rectangle rect = new Rectangle(0, 0, bmp.Width, bmp.Height);

 BitmapData bmpData = bmp.LockBits(rect, ImageLockMode.ReadWrite, pxf);

 // Получаем адрес первой строки развертки

 IntPtr ptr = bmpData.Scan();

 // Массив, содержащий байты изображения

 int numBytes = bmp.Width * bmp.Height * 3;

 byte[] rgbValues = new byte[numBytes];

 // Копируем значения RGB в массив

 Marshal.Copy(ptr, rgbValues, 0, numBytes);

 // Модифицируем изображение, устанавливая

 // синий цвет для каждой точки в картинке

 for (int counter = 0; counter < rgbValues.Length; counter += 6)

  rgbValues[counter] = 255;

 // Копируем значения RGB обратно в изображение

 Marshal.Сору(rgbValues, 0, ptr, numBytes);

 // Разблокируем биты в памяти

 bmp.UnlockBits(bmpData);

}

После запуска приложения на экране будут показаны две копии картинки, причем нижнее изображение будет немного отличаться от верхнего насыщенностью цветов.