Selbst dieser Versuch, einen lokalen TRGBQuad zu verwenden (cu- und co-Variablen), führt bei 5 Durchläufen, bei einem Bitmap von ca. 3500x2500 Pixel zu 300 MS mehr Zeit:
Delphi-Quellcode:
procedure Draw32BitToBitmapNew(const BitOben: TBitmap; BitUnten: TBitmap);
var
h,w,i: Integer;
RGBA_Unten, RGBA_Oben: pRGBALine;
cu, co : TRGBQuad;
begin
For h := 0 to BitUnten.Height-1 do begin
RGBA_Unten := BitUnten.ScanLine[h];
RGBA_Oben := BitOben.ScanLine[h];
For w:= 0 to BitUnten.Width-1 do begin
if RGBA_Oben^[w].rgbReserved = 0 then begin
// unten bleibt
end else begin
cu := RGBA_Unten^[w];
co := RGBA_Oben^[w];
i := Round (cu.rgbBlue - ((cu.rgbBlue - co.rgbBlue) / 255 * co.rgbReserved));
if i < 0 then RGBA_Unten^[w].rgbBlue := 0 else if i > 255 then RGBA_Unten^[w].rgbBlue := 255 else RGBA_Unten^[w].rgbBlue := i;
i := Round (cu.rgbGreen - ((cu.rgbGreen - RGBA_Oben^[w].rgbGreen) / 255 * co.rgbReserved));
if i < 0 then RGBA_Unten^[w].rgbGreen := 0 else if i > 255 then RGBA_Unten^[w].rgbGreen := 255 else RGBA_Unten^[w].rgbGreen := i;
i := Round (cu.rgbRed - ((cu.rgbRed - co.rgbRed) / 255 * co.rgbReserved));
if i < 0 then RGBA_Unten^[w].rgbRed := 0 else if i > 255 then RGBA_Unten^[w].rgbRed := 255 else RGBA_Unten^[w].rgbRed := i;
RGBA_Unten^[w].rgbReserved := 255;
end;
end;
end;
end;