AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi BrushCopy - nur schneller (Scanline+Pointer)
Thema durchsuchen
Ansicht
Themen-Optionen

BrushCopy - nur schneller (Scanline+Pointer)

Ein Thema von LDericher · begonnen am 20. Sep 2009 · letzter Beitrag vom 20. Sep 2009
Antwort Antwort
Benutzerbild von LDericher
LDericher

Registriert seit: 29. Jan 2007
Ort: Erkelenz
224 Beiträge
 
Delphi 7 Enterprise
 
#1

BrushCopy - nur schneller (Scanline+Pointer)

  Alt 20. Sep 2009, 14:29
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:
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;
Der ist mir allerdings zu langsam, da der Mist viel zu oft ausgeführt werden wird
Also hab ich mir eine Version gebaut, die auf Pointern basiert:
Delphi-Quellcode:
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;
Nur irgendwie tut die nicht ganz, was sie soll: Es werden willkürlich einige Pixel von BMP nicht übernommen, wie man im Demoprojekt sieht.
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
Angehängte Dateien
Dateityp: zip littlespriteengine_124.zip (24,8 KB, 12x aufgerufen)
"Clicking this button you agree with our Verantwortungsverzicht und Abkommen."
Zitat von Ein unentschlossener Programmierer:
Enabled:=true or false or true or false or true or false;
  Mit Zitat antworten Zitat
Benutzerbild von LDericher
LDericher

Registriert seit: 29. Jan 2007
Ort: Erkelenz
224 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: BrushCopy - nur schneller (Scanline+Pointer)

  Alt 20. Sep 2009, 16:03
Wasn los mit euch?
Liegts am Sonntag? Habt ihr frei?
Sonst wisst ihr doch auf alles ne Antwort!

Naja, ich warte weiterhin gespannt auf einen Hinweis

Gruß von eurem LDer^^
"Clicking this button you agree with our Verantwortungsverzicht und Abkommen."
Zitat von Ein unentschlossener Programmierer:
Enabled:=true or false or true or false or true or false;
  Mit Zitat antworten Zitat
Benutzerbild von LDericher
LDericher

Registriert seit: 29. Jan 2007
Ort: Erkelenz
224 Beiträge
 
Delphi 7 Enterprise
 
#3

Re: BrushCopy - nur schneller (Scanline+Pointer)

  Alt 20. Sep 2009, 17:35
Okay, ich habs selbst hingekriegt:

Das hier:
if((P^.R<>T^.R)and(P^.G<>T^.G)and(P^.B<>T^.B)) musste durch das hier:
if(P^.R<>T^.R)or(P^.G<>T^.G)or(P^.B<>T^.B) ersetzt werden... So was blödes
Und trotzdem Danke auch wenns niemand gesehn hat^^

Bis Bald,
Der LDer
"Clicking this button you agree with our Verantwortungsverzicht und Abkommen."
Zitat von Ein unentschlossener Programmierer:
Enabled:=true or false or true or false or true or false;
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#4

Re: BrushCopy - nur schneller (Scanline+Pointer)

  Alt 20. Sep 2009, 17:53
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?
fork me on Github
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#5

Re: BrushCopy - nur schneller (Scanline+Pointer)

  Alt 20. Sep 2009, 18:14
Zitat von LDericher:
Wasn los mit euch?
Liegts am Sonntag? Habt ihr frei?
Was'n mit dir los?
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.
$2B or not $2B
  Mit Zitat antworten Zitat
brechi

Registriert seit: 30. Jan 2004
823 Beiträge
 
#6

Re: BrushCopy - nur schneller (Scanline+Pointer)

  Alt 20. Sep 2009, 18:17
Warum verwendest du denn die WinAPI nicht?

http://www.winprog.org/tutorial/transparency.html
  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 07:16 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