// 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[xSrc].rgbtRed;
g = srcRow[xSrc].rgbtGreen;
b = srcRow[xSrc].rgbtBlue;
// irgendwas mit den RGB-Werten machen
// r,g,b setzen
srcRow[xSrc].rgbtRed = r;
srcRow[xSrc].rgbtGreen = g;
srcRow[xSrc].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();
}