8 Ocak 2018 Pazartesi

BitmapData Sınıfı

Constructor
Şöyle yaparız.
Bitmap bitmap = ...;
BitmapData bmData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height),
  ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
Scan0 Alanı
Açıklaması şöyle.
Scan0 returns an address of the first pixel data. Stride is the width of single row of pixels (scan line) in bytes (with optional padding to make it dividable by 4).
Şöyle yaparız.
byte* p = (byte*)(void*)bmData.Scan0.ToPointer();
Belli bir satıra gitmek için şöyle yaparız.
byte* p = (byte*)(void*)bmData.Scan0.ToPointer();
byte* row = p + y * bmData.Stride;
Tümünü dolaşmak için şöyle yaparız
double GetImageValue(Bitmap image)
{
  double imageValue = 0;

  // Lock the bitmap's bits.  
  var rect = new Rectangle(0, 0, image.Width, image.Height);
  var bmpData = image.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadOnly,
    System.Drawing.Imaging.PixelFormat.Format24bppRgb);

  // Get the address of the first line.
  var ptr = bmpData.Scan0;

  // Declare an array to hold the bytes of the bitmap.
  var bytes = Math.Abs(bmpData.Stride) * image.Height;
  var values = new byte[bytes];

  // Copy the RGB values into the array.
  System.Runtime.InteropServices.Marshal.Copy(ptr, values, 0, bytes);

  // Add the rgb values to ImageValue
  for (int y = 0; y < image.Height; y++)
  {
    int lineStart = y * Math.Abs(bmpData.Stride);
    for (int x = 0; x < image.Width * 3; x++)
    {
      imageValue += values[lineStart + x];
    }
  }

  // Unlock the bits.
  image.UnlockBits(bmpData);

  return imageValue;
}

Hiç yorum yok:

Yorum Gönder