Schneller Bitmap-Zugriff per Scanline

// Die normalen Canvas-Zeichenmethoden brauchen viel zu lange,
// um akzeptable Bearbeitungszeiten bei einem Bitmap zu erreichen.
// Besser ist es, man greift direkt auf das Bitmap per Scanline zu.
// im Beispiel wird ein TImage mit dem Namen "Image" und
// PixelFormat = pf24bit auf der MainForm verwendet
void __fastcall TMainForm::TestBtnClick(TObject *Sender)
{
    PRGBTriple srcRow;
    int iHeight = Image->Picture->Bitmap->Height;
    int iWidth = Image->Picture->Bitmap->Width;
    int r,g,b;

    // überprüfen, ob ein 24Bit Bild vorliegt
    if (Image->Picture->Bitmap->PixelFormat == pf24bit)
    {
        try
        {
            // Bild in y-Richtung durchlaufen
            for (int ySrc = 0; ySrc<iHeight; ySrc++)
            {
                // Scanline holen
                srcRow = (PRGBTriple)Image->Picture->Bitmap->ScanLine[ySrc];

                // Scanline durchlaufen (x-Richtung)
                for (int xSrc = 0; xSrc < iWidth; xSrc++)
                {
                    // r,g,b auslesen
                    r = srcRow&#91;xSrc&#93;.rgbtRed;
                    g = srcRow&#91;xSrc&#93;.rgbtGreen;
                    b = srcRow&#91;xSrc&#93;.rgbtBlue;

                    // irgendwas mit den RGB-Werten machen

                    // r,g,b setzen
                    srcRow&#91;xSrc&#93;.rgbtRed = r;
                    srcRow&#91;xSrc&#93;.rgbtGreen = g;
                    srcRow&#91;xSrc&#93;.rgbtBlue = b;
                }
            }
        }
        catch ( Exception &E )
        {
            MessageDlg(E.Message, mtError, TMsgDlgButtons() << mbOK, 0);
        }
    }
    else MessageDlg("Das Bild muss ein Bitmap mit 24Bit Farbtiefe sein!", mtError, TMsgDlgButtons() << mbOK, 0);

    Image->Repaint();
}

Schreibe einen Kommentar