Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Tiles Funktion von Photoshop (https://www.delphipraxis.net/35405-tiles-funktion-von-photoshop.html)

-NIP- 6. Dez 2004 18:16


Tiles Funktion von Photoshop
 
Hi!
Ich habe hier mal versucht den Tiles-Filter von Photoshop nachzuahmen:

Delphi-Quellcode:
procedure Vierecke (Quellbild:TBitmap; Zielbild:TBitmap; XAnzahl:Integer;
YAnzahl:Integer; Abweichung:Integer; Hintergrundfarbe:TColor);
var
  Breite,Hoehe,i,i2,AbweichungX,AbweichungY,XRasterPos,
  YRasterPos,HoehePos,BreitePos:Integer;
  EndBild:TBitmap;
begin
  Breite:=Quellbild.Width div XAnzahl;
  Hoehe:=Quellbild.Height div YAnzahl;
    EndBild:=TBitmap.Create;
    EndBild.Canvas.Brush.Color:=Hintergrundfarbe;
    EndBild.Width:=Quellbild.Width;
    EndBild.Height:=Quellbild.Height;
  for i:= 1 to XAnzahl*YAnzahl do
  begin
    AbweichungX:=random(Abweichung*2);
    AbweichungY:=random(Abweichung*2);
    for i2:= 1 to Breite*Hoehe do
    begin
      if i2=1 then
      begin
        BreitePos:=XRasterPos*Breite;
        HoehePos:=YRasterPos*Hoehe;
      end;
      if BreitePos > Breite*XRasterPos then
        BreitePos:=XRasterPos*Breite
      else
      begin
        BreitePos:=BreitePos+1;
        HoehePos:=HoehePos+1;
      end;
      EndBild.Canvas.Pixels[BreitePos-AbweichungX+Abweichung,HoehePos-AbweichungY+Abweichung]:=Quellbild.Canvas.Pixels[BreitePos,HoehePos];
    end;
    if XRasterPos > XAnzahl then
      XRasterPos:=0
    else
      XRasterPos:=XRasterPos+1;

    if YRasterPos > YAnzahl then
      YRasterPos:=0
    else
      YRasterPos:=YRasterPos+1;

Zielbild:=Endbild;

  end;
end;
Aber aus irgendeinem Grund funzt das nicht. Wenn ich das anwende passiert GARNICHTS!
Liegt das an der Art, wie ich das Endprodukt dem Zielbild zuweise?
Wenn ich es compiliere, sagt er, dass der auf Zielbild zugewiesene Wert niemals benutzt wird!?!

Ich hoffe ihr macht euch die Mühe mir zu helfen ;) .

-NIP-

-NIP- 7. Dez 2004 19:05

Re: Tiles Funktion von Photoshop
 
Kommt schon Leute :zwinker:
Liegt es an der Zuweisung von Endbild zu Zielbild?
Da auf dem Zielbild ja garnichts erscheint, bin ich ziemlich ratlos...

-NIP-

Dax 7. Dez 2004 19:25

Re: Tiles Funktion von Photoshop
 
Deklariere Zielbild mal als var oder das ganze als Funktion.

jim_raynor 7. Dez 2004 19:27

Re: Tiles Funktion von Photoshop
 
Besser ist ZielBitmap.Assign(EndBitmap);

dizzy 7. Dez 2004 19:29

Re: Tiles Funktion von Photoshop
 
Problem dabei wäre allerdings dass du ein Speicherleck erzeugst. Vor der Zuweisung (wenn Zielbild als var-Parameter deklariert ist) solltest du ein "If Assigned(Zielbild) then Zielbild.free;" machen.

-NIP- 7. Dez 2004 20:08

Re: Tiles Funktion von Photoshop
 
Wenn ich euch richtig verstanden habe muss der Code nach dem ganzen Zeichnen so enden:
Delphi-Quellcode:
if Assigned(Zielbild) then
begin
  Zielbild.Free;
end;
Zielbild.Assign(Endbild);
Wenn ich den Code dann ausführe gibt es komischerwiese eine AccessViolation... :gruebel:
Hab ich was falsch gemacht?

-NIP-

edit: Und zwar wenn ich die PaintBox repainte.

dizzy 7. Dez 2004 20:20

Re: Tiles Funktion von Photoshop
 
Zitat:

Zitat von -NIP-
Wenn ich euch richtig verstanden habe muss der Code nach dem ganzen Zeichnen so enden:
Delphi-Quellcode:
if Assigned(Zielbild) then
begin
  Zielbild.Free;
end;
Zielbild.Assign(Endbild);

:D Jetzt hast du 2 Varianten gemischt.

Entweder nur mit Zielbild.Assign(), oder mit Freigeben und nachher die Zuweisung wie oben (Zielbild := Endbild;).
Die 2. Variante dürfte schneller sein.

-NIP- 7. Dez 2004 20:36

Re: Tiles Funktion von Photoshop
 
Zitat:

Zitat von dizzy
Zitat:

Zitat von -NIP-
Wenn ich euch richtig verstanden habe muss der Code nach dem ganzen Zeichnen so enden:
Delphi-Quellcode:
if Assigned(Zielbild) then
begin
  Zielbild.Free;
end;
Zielbild.Assign(Endbild);

:D Jetzt hast du 2 Varianten gemischt.

Entweder nur mit Zielbild.Assign(), oder mit Freigeben und nachher die Zuweisung wie oben (Zielbild := Endbild;).
Die 2. Variante dürfte schneller sein.

Also die 2. hat nicht funktioniert, aber die erste. Dabei kam allerdings voll der Müll raus :-D
Muss meinen Code wohl noch einmal unter die Haube schaun ;)

Danke

-NIP-


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:25 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