![]() |
BrushCopy - nur schneller (Scanline+Pointer)
Liste der Anhänge anzeigen (Anzahl: 1)
Also, ich versuche eine Möglichkeit zu finden, ein Bitmap (abgelegt in einer selbstdefinierten Listenstruktur) in ein anderes zu kopieren und dabei eine Farbe auszulassen, nämlich die, die in der oberen linken Ecke sitzt.
Mit dem Pixelzugriff funktioniert das auch einigermaßen:
Delphi-Quellcode:
Der ist mir allerdings zu langsam, da der Mist viel zu oft ausgeführt werden wird :wink:
procedure TForm1.MapToImagePix(Aug:TBitmap);
var I, J:integer; T:TColor; BMP:TBitmap; begin BMP:=List.CurrentContent as TBitmap; T:=BMP.Canvas.Pixels[1, 1]; for I:=0 to(BMP.Height-1)do begin for J:=0 to(BMP.Width-1)do begin if(BMP.Canvas.Pixels[J, I]<>T) then Aug.Canvas.Pixels[J, I]:=BMP.Canvas.Pixels[J, I]; end; end; end; Also hab ich mir eine Version gebaut, die auf Pointern basiert:
Delphi-Quellcode:
Nur irgendwie tut die nicht ganz, was sie soll: Es werden willkürlich einige Pixel von BMP nicht übernommen, wie man im Demoprojekt sieht.
type
{...} TPixRec=record B, G, R:Byte; end; PPixRec=^TPixRec; {...} procedure TForm1.MapToImagePoi(Aug:TBitmap); var I, J:integer; P, Q, T:PPixRec; BMP:TBitmap; begin BMP:=List.CurrentContent as TBitmap; T:=BMP.ScanLine[1]; inc(T); for I:=0 to(BMP.Height-1)do begin P:=BMP.ScanLine[I]; Q:=Aug.ScanLine[I]; for J:=0 to(BMP.Width-1)do begin if((P^.R<>T^.R)and(P^.G<>T^.G)and(P^.B<>T^.B))then begin Q^.R:=P^.R; Q^.G:=P^.G; Q^.B:=P^.B; end; inc(P); inc(Q); end; end; end; Links die Version mit Pixeln, rechts die Pointervariante. MfG, Euer LDer. P.S. Edit: Bevor ihr sagt, ich sollte das ganze erstmal in ne neue Unit auslagern, um dann nen OOP-Header drumzuschrauben: Das habe ich vor, aber erst, wenn ich sicher sein kann, dass meine Methode funktioniert ;) |
Re: BrushCopy - nur schneller (Scanline+Pointer)
Wasn los mit euch? :D
Liegts am Sonntag? Habt ihr frei? :D Sonst wisst ihr doch auf alles ne Antwort! :dp: :dp: :dp: Naja, ich warte weiterhin gespannt auf einen Hinweis :-P Gruß von eurem LDer^^ |
Re: BrushCopy - nur schneller (Scanline+Pointer)
Okay, ich habs selbst hingekriegt:
Das hier:
Delphi-Quellcode:
musste durch das hier:
if((P^.R<>T^.R)and(P^.G<>T^.G)and(P^.B<>T^.B))
Delphi-Quellcode:
ersetzt werden... So was blödes :wall:
if(P^.R<>T^.R)or(P^.G<>T^.G)or(P^.B<>T^.B)
Und trotzdem Danke auch wenns niemand gesehn hat^^ Bis Bald, Der LDer |
Re: BrushCopy - nur schneller (Scanline+Pointer)
Warum machst du daraus nicht ein ganz normale Prozedur, die zwei TBitmap als Übergabeparameter bekommt?
Warum arbeitet du so umständlich mit der Variablen "T" anstatt den Rot-, Grün und Blauanteil in einzelne Variablen zu übernehmen? Das Pixel ganz links oben hat die Koordinaten [0,0] und nicht [1,1]. Ist das ein Versehen oder Absicht? |
Re: BrushCopy - nur schneller (Scanline+Pointer)
Zitat:
Oder hast die Reglung mit dem Puschen vergessen? Du weißt aber, daß die [1]+Inc(T) nicht die obere linke Ecke ist? Dieses ist 1 Pixel rechts über der unteren linken Ecke
Delphi-Quellcode:
var C: LongInt;
T := BMP.ScanLine[1]; Inc(T); C := PLongInt(T)^ and $00FFFFFF; for I := BMP.Height - 1 downto 0 do begin P := BMP.ScanLine[I]; Q := Aug.ScanLine[I]; for J := BMP.Width - 1 downto 0 do begin if PLongInt(P)^ and $00FFFFFF <> C then begin PWord(Q)^ := PWord(P)^; Q.R:=P.R; end; inc(P); inc(Q); end; end; // oder if PLongInt(P)^ and $00FFFFFF <> C then begin PLongInt(Q)^ := (PLongInt(Q)^ and $FF000000) or (PLongInt(P)^ and $00FFFFFF); end; // oder var C2: LongInt; C2 := PLongInt(P)^ and $00FFFFFF; if C2 <> C then begin PLongInt(Q)^ := (PLongInt(Q)^ and $FF000000) or C2; end; Wer jetzt wegen dem letzen Pixel Angst hat, bezüglich des einen zusätzlich gelesenen Bytes und einem Zugriffsfehler ... keine Angst, im Bitmap ist der Speicher auf ganze Integer-Grenzen reserviert und notfalls wird aufgerundet. |
Re: BrushCopy - nur schneller (Scanline+Pointer)
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:33 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz