schneller Zugriff auf Bitmaps, Manipulation von Bitmaps

  • Achtung: Das Lock/Unlock des Bitmaps sollte normalerweise nur einmal vor/nach Operationen am Bitmap erfolgen und nicht jedesmal direkt in der Funktion selber, da dies zusätzliche Zeit benötigt.
  • eine sehr interessante Klasse für den Zugriff auf Bitmaps einschließlich diverser Funktionen gibt es hier: Link
private struct SPixelData
{
    public byte R;
    public byte G;
    public byte B;
}
// Funktion ist unsafe, da Pointer verwendet werden
public unsafe int GetGreyValue(Bitmap b, int x, int y)
{
    int iGrey = 0;

    // Bildgröße herausfinden
    Rectangle r = new Rectangle(Point.Empty, b.Size);

    int iWidth = (int)(r.Width * sizeof(SPixelData));

    // Bitmap locken
    BitmapData bdData = b.LockBits(r, ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);

    // Zeiger auf das Bild holen
    byte* pBase = (byte*)bdData.Scan0.ToPointer();

    // Zeiger auf das Pixel n der Stelle x,y holen
    SPixelData* pPixel = (SPixelData*)(pBase + y * iWidth + x * sizeof(SPixelData));

    // Grauwert ausrechnen
    iGrey = (int)((pPixel->R * 0.3) + (pPixel->G * 0.59) + (pPixel->B * 0.11));

    // Bitmap wieder freigeben
    b.UnlockBits(bdData);

    return iGrey;
}