Einzelnen Beitrag anzeigen

Muetze1
(Gast)

n/a Beiträge
 
#8

Re: Schnellerer Zugriff als Bitmap.Canvas.Pixels

  Alt 14. Aug 2007, 08:37
Zitat von Alex_ITA01:
Achso, aber so wie ich mir ScanLine angeguckt habe, ist es immer für eine Zeile.
Ich habe doch aber mehrere verschiedene Farben (Pixel) in einer Zeile. Wie geht das dann?
Du bekommst den Zeiger auf eine Zeile Pixeldaten. Die Pixeldaten sind dabei unterschiedlich aufgebaut, abhängig von dem eingestellten PixelFormat (siehe Delphi-Referenz durchsuchenTBitmap.PixelFormat). Bei pf32bit zeigt der Zeiger auf TBitmap.Width mal eine Struktur vom Typ TRGBQuad (also R, G, B + Reserved). Bei pf24bit auf TBitmap.Width mal eine Struktur vom Typ TRGBTriple, etc.

Es ist zu empfehlen, das PixelFormat auf pf32bit zu setzen und mit einem PRGBQuad zu arbeiten. Dies ist deutlich performanter.

Beispiel:
Delphi-Quellcode:
var
  lPixel: PRGBQuad;
begin
  Bmp := TBitmap.Create;
  try
    Bmp.Width := 1024;
    Bmp.Height := 768;
    Bmp.Pixelformat := pf32bit;

    for i := 0 to Bmp.Height-1 do
    begin
      lPixel := Bmp.ScanLine[i]; // Zeiger auf die Zeile holen

      for j := 0 to Bmp.Width-1 do
      begin
          // Pixel Farbwerte zuweisen.
        lPixel.rgbRed := $ff;
        lPixel.rgbGreen := $44;
        lPixel.rgbBlue := $77;

        Inc(lPixel); // auf zum nächsten Pixel
      end;
    end;

    Bmp.SaveToFile('C:\Test.bmp');
  finally
    Bmp.Free;
  end;
end;
/EDIT: roter Kasten? Hätte ich mir ja klemmen können...
  Mit Zitat antworten Zitat