AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Scanline vs. Pixels

Ein Thema von Noobinator · begonnen am 1. Feb 2008 · letzter Beitrag vom 2. Feb 2008
Antwort Antwort
Noobinator

Registriert seit: 9. Mai 2006
147 Beiträge
 
Delphi 7 Personal
 
#1

Scanline vs. Pixels

  Alt 1. Feb 2008, 18:01
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

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
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Scanline vs. Pixels

  Alt 1. Feb 2008, 18:09
Wieso nimmst Du nicht einfach CopyRect?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Noobinator

Registriert seit: 9. Mai 2006
147 Beiträge
 
Delphi 7 Personal
 
#3

Re: Scanline vs. Pixels

  Alt 1. Feb 2008, 18:12
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?
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: Scanline vs. Pixels

  Alt 1. Feb 2008, 18:20
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;
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#5

Re: Scanline vs. Pixels

  Alt 1. Feb 2008, 20:23
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.
  Mit Zitat antworten Zitat
Benutzerbild von rawsoul
rawsoul

Registriert seit: 29. Okt 2006
Ort: Düsseldorf
249 Beiträge
 
Delphi 2005 Personal
 
#6

Re: Scanline vs. Pixels

  Alt 1. Feb 2008, 20:58
BitBlt ist auch sehr schnell.
Frank Dumont
  Mit Zitat antworten Zitat
Noobinator

Registriert seit: 9. Mai 2006
147 Beiträge
 
Delphi 7 Personal
 
#7

Re: Scanline vs. Pixels

  Alt 2. Feb 2008, 09:55
ahh stimmt Bitblt gab es ja auch noch

Habe es jetzt damit gelöst.

Aber an alle Anderen trotzdem Danke =)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:20 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