Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Scanline vs. Pixels (https://www.delphipraxis.net/107759-scanline-vs-pixels.html)

Noobinator 1. Feb 2008 18:01


Scanline vs. Pixels
 
hallihallo ich bin es mal wieder^^

Also:

Ich habe momentan das Problem, das ich von einem ganz ganz großem Tbitmap ein Auschnitt von 0,0 bis X,Y kopieren möchte und in ein anderes Image einfügen.

mein Momentaner Code:

Delphi-Quellcode:
var bmp:Tbitmap;
    X,Y,i,j:integer;
begin
    bmp := Tbitmap.Create;
    X := getmaxx(elements) + 50; // X festlegen
    Y := getmaxY(elements) + 50;// Y festlegen
    bmp.Width := X;// neue BMP initialisieren
    bmp.Height := Y;
    for i := 0 to X do// Pixelweise durchgehen
        for j := 0 to Y do
          bmp.Canvas.Pixels[i,j] := buffer.Canvas.Pixels[i,j];
// Buffer ist ein schon bestehendes Tbitmap Objekt
 end;
nunja jetzt werdet ihr sagen

:shock: ahhh Pixelweiser Zugriff, wie langsam soll das denn noch werden, und ja das habe ich auch gemerkt^^

nun habe ich in meine Glaskugel geschaut und Scanline entdeckt, welches mir ja einen Pointer auf eine komplette Reihe zurückgibt.

so sweit so gut, aber zum Zuweisen dieser Reihe von 0 bis X auf mein neues Image müsste ich ja wieder über die Pixel eigenschaft gehen oder?

jedenfalls hackt es genau an dieser Stelle.
Wie kann ich bei Scanline nur einen Teil wieder zuweisen, ohne wieder über die Pixel Eigentschaft gehen zu müssen?

Idee:
Delphi-Quellcode:
type Pix = array[1..3] of byte;
var p:^Pix;

for i := 0 to y do
begin
  p := buffer.scanline[i];
  for j := 0 to x do
    bmp.canvas.pixel[j,i] := p^[j]; // Hier muss ich doch wieder über Pixel gehen??
end;
Schonmal danke für Hilfe

DeddyH 1. Feb 2008 18:09

Re: Scanline vs. Pixels
 
Wieso nimmst Du nicht einfach CopyRect?

Noobinator 1. Feb 2008 18:12

Re: Scanline vs. Pixels
 
Ja das hat meine Glaskugel auch schon ausgespuckt, aber damit kam ich garnicht erst zurande :(

könntest du deine Antwort vllt etwas näher ausführen?

DeddyH 1. Feb 2008 18:20

Re: Scanline vs. Pixels
 
Beispiel aus der Delphi-Hilfe:
Zitat:

Dieses Beispiel zeigt den Unterschied zwischen den beiden Methoden CopyRect und BrushCopy. Das Bitmap TARTAN.BMP wird in ein TBitmap-Objekt geladen und auf der Zeichenfläche von Form1 angezeigt. BrushCopy ersetzt die Farbe Schwarz in der Grafik durch den Pinsel der Zeichenfläche. CopyRect lässt die Farben intakt.

var
Bitmap: TBitmap;
MyRect, MyOther: TRect;
begin

MyRect := Rect(10,10,100,100);

MyOther := Rect(10,111,100, 201);
Bitmap := TBitmap.Create;
Bitmap.LoadFromFile('c:\windows\tartan.bmp');
Form1.Canvas.BrushCopy(MyRect, Bitmap, MyRect, clBlack);
Form1.Canvas.CopyRect(MyOther,Bitmap.Canvas,MyRect );
Bitmap.Free;
end;

Muetze1 1. Feb 2008 20:23

Re: Scanline vs. Pixels
 
1. Wenn dein Bitmap eine Weite X hat, dann hast du PixelIndizies von 0 bis Width-1. In deinen beiden Codes gehen alle Schleifen einen zu weit.
2. Da dir der 1. Punkt noch nicht selber aufgefallen ist, hast du wohl keine Bereichsprüfung an. Ich empfehle dir dringend während der Entwicklungsphase die Bereichsprüfung sowie die Überlaufprüfung in den Projektoptionen->Compiler einzuschalten und das Projekt komplett neu zu erstellen.
3. Dein Pixel Struktur "Pix" kannst du mit TRGBTriple bzw. als Zeiger mit PRGBTriple ersetzen. Damit hast du dann auch gleich die richtig benannten Farbanteile.
4. Zu der Frage in deinem letzten Code: Ja, du musst natürlich den Zeiger auf den nächsten Pixel verschieben, also innerhalb der Schleife nach dem Zugriff noch ein Inc(p); einfügen.
5. Du greifst auf die Pixeldaten zu, als wenn es im pf24bit Format vorliegt. Dies wird aber durch dein Code überhaupt nicht sicher gestellt und nach dem anlegen eines Bitmaps ist dies sogar ein DDB (device-dependent bitmap) und somit dürftest du die ScanLine[] Eigenschaft gar nicht nutzen. Von daher: setze vorher die PixelFormat Eigenschaft explizit auf pf24bit.

rawsoul 1. Feb 2008 20:58

Re: Scanline vs. Pixels
 
BitBlt ist auch sehr schnell.

Noobinator 2. Feb 2008 09:55

Re: Scanline vs. Pixels
 
ahh stimmt Bitblt gab es ja auch noch :wall:

Habe es jetzt damit gelöst.

Aber an alle Anderen trotzdem Danke =)


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:34 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz