Irgendwie ist der Code seltsam, warum läuft deine I-Schleife gegen Null?
Im Array ist zu jedem Pixel nur ein Byte aufgezeichnet (Graustufen vermutlich).
Du baust daraus ein TmpRGB, verwendest danach aber nur das unteren Byte von TmpRGB.
Dieses wird für jeden Farbkanal einzeln geschrieben (BGR, Pixelformat pf24Bit).
Das geht auch einfacher:
Delphi-Quellcode:
var
TmpLine: PByte;
TmpByte: Byte;
for I := 0 to BILDHÖHE - 1 do
begin
TmpLine := BITMAP.ScanLine[I];
for J := 0 to BILDBREITE - 1 do
begin
TmpByte := OLEVARIANT[I, J]; // Grau
TmpLine^ := TmpByte; // Blau
Inc(TmpLine);
TmpLine^ := TmpByte; // Gruen
Inc(TmpLine);
TmpLine^ := TmpByte; // Rot
Inc(TmpLine);
end;
end;
Ist das noch nicht schnell genug, wirds komplizierter:
- Pixelformat der Bitmap auf 256Farben mit Palette umgestellt
- Palette mit 256 Graustufen erstellen und für die Bitmap auswählen
- mit SafeArrayLock() und SafeArrayAccessData() einen Pointer auf die Daten des Variant besorgen
- die Daten direkt in die Bitmap kopieren
- mit SafeArrayUnaccessData() und SafeArrayUnlock() den Variant wieder entsperren