Moin!
Du arbeitest mit dem langsamen Pixels[] Zugriff. Den Wert den du aus ScanLine rausholst benutzt du nicht. Ausserdem hast du bei 24 Bit 3 Bytes pro Pixel, somit greifst du völlig falsch auf die Pixeldaten zu. Und 24 Bit sind von Haus aus langsam, da der Prozessor extra Lesezyklen pro Pixel einfügen muss...
Ok, ScanLine, weisse Pixel in blaue:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
BitMap: TBitMap;
y, x: integer;
P: PRGBQuad; // definiert in Windows.pas
begin
BitMap := TBitMap.create;
try
BitMap.LoadFromFile('Datei.bmp');
BitMap.PixelFormat:= pf32Bit;
for y := 0 to BitMap.Height - 1 do
begin
P := BitMap.ScanLine[y];
for x := 0 to BitMap.Width - 1 do
begin
If ( P^.rgbRed = $ff ) And ( P^.rgbGreen = $ff ) And ( P^.rgbBlue = $ff ) Then
Begin
P^.rgbRed := 0;
P^.rgbGreen := 0;
// P^.rgbBlue := $ff; <-- haben wir ja schon, siehe IF Bedingung
End;
Inc(P);
end;
end;
finally
BitMap.Free;
end;
end;
Und dazu eine reine Pixels[] Routine:
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var
BitMap: TBitMap;
y, x: integer;
begin
BitMap := TBitMap.create;
try
BitMap.LoadFromFile('Datei.bmp');
BitMap.PixelFormat:= pf32Bit; // gleiche Grundlagen schaffen
for y := 0 to BitMap.Height - 1 do
begin
for x := 0 to BitMap.Width - 1 do
begin
If ( BitMap.Canvas.Pixels[x, y] = clWhite ) Then
Bitmap.Canvas.Pixels[x, y] := clBlue;
end;
end;
finally
BitMap.Free;
end;
end;
So, vergleiche die beiden Routinen mal nach Geschwindigkeit - und benutze dabei am besten aucb Bilder die deutlich grösser als 300x300 sind...
MfG
Muetze1