Метод 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);
}
После запуска приложения на экране будут показаны две копии картинки, причем нижнее изображение будет немного отличаться от верхнего насыщенностью цветов.