Einzelnen Beitrag anzeigen

Muetze1
(Gast)

n/a Beiträge
 
#9

Re: Scanline erklären

  Alt 11. Mär 2005, 23:07
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
  Mit Zitat antworten Zitat