Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Programm Design mit TPNGObject (https://www.delphipraxis.net/170073-programm-design-mit-tpngobject.html)

sportkeks 29. Aug 2012 14:05


Programm Design mit TPNGObject
 
Hallo Gemeinde,

Ich wende mich mal wieder Hilfesuchend an euch (nachdem Sufu nix gebracht hat) und hoffe das irgendein schlauer Mensch mir helfen kann.

Es geht um ein Programm dessen Design zur zeit komplett aus Tbitmaps besteht und gezeichnet wird, inkl. selbst gezeichneten Buttons etc.

Das funktioniert bis her auch echt gut nur möchte ich jetzt gerne auf TPNGObjects umsteigen da diese Transparenzen mit bringen und sich das Design so noch mehr verfeinern lässt.

Nun zu meinem Problem:

Wie kann ich ein TPNGObject (Performance sparend !!!!) auf ein anderes TNGObject zeichen ?

Ein einfaches:

Delphi-Quellcode:
png.Canvas.Draw(100,100,png2);


reicht leider nicht da hierbei die Transparenz nicht mit übertragen wird.
Überträgt man den Alphakanal pixel per pixel via

Delphi-Quellcode:
png.AlphaScanline(...


auf das andere Png, endet das ganze hochgerechnet auf alle zu zeichnenden Bilder in einem "Performalen" Disaster!!!

Delphi-Quellcode:
png.Assign(png2);


ist deutlich schneller,überträgt auch den Alphakanal aber ich kann die größe nicht anpassen und schon gar nicht X und Y Koordinaten festlegen :(

Das ganze brauche ich um das Offpng zu zeichen(Png >drawto> Png mit X und Y und Resize) welches dann in onpaint() auf eine Paintbox gezeichnet wird.

Ich hoffe ihr konntet mir bis hier hin folgen.

Wenn jemand eine Idee hat ein Png Performance sparend auf ein anderes Png zu zeichen oder eine bessere Lösung zur Hand hat dann bitte helft mir :cyclops:

Grüße

Der Keks


Ps. ich verwende Turbodelphi

Bummi 29. Aug 2012 14:10

AW: Programm Design mit TPNGObject
 
Delphi-Quellcode:
Paintbox.Canvas.Draw(x,y,PNGIMG)
behält doch alle Transparenzen bei, oder habe ich Dich falsch verstanden ...

sportkeks 29. Aug 2012 14:16

AW: Programm Design mit TPNGObject
 
Ja das ist richtig aber ich möchte ja vorher auf ein Offpng zeichnen um das mal zu verdeutlichen:

Delphi-Quellcode:
Offpng.Canvas.Draw(0,0,png1);
Offpng.Canvas.Draw(0,100,png2);
Offpng.Canvas.Draw(0,200,png3);
Offpng.Canvas.Draw(0,300,png4);

Paintbox.canvas.draw(0,0,offpng);
schreibe ich das so...:

Delphi-Quellcode:
Paintbox.canvas.draw(0,0,png1);
Paintbox.canvas.draw(0,100,png2);
Paintbox.canvas.draw(0,200,png3);
Paintbox.canvas.draw(0,300,png4);

...endet das in einem wildem geflacker der Paintbox :?

Bummi 29. Aug 2012 14:27

AW: Programm Design mit TPNGObject
 
vielleicht hilft Dir das, der Teil in Button1 ist bis auf
SetAlpha(bmp2,0);
realtiv uninteressant ....

Delphi-Quellcode:
type
  pRGBQuadArray = ^TRGBQuadArray;
  TRGBQuadArray = ARRAY[0..$effffff] OF TRGBQuad;


Procedure SetAlpha(bmp:TBitMap;Alpha:Byte);
var
 pscanLine32 : pRGBQuadArray;
 i,j:Integer;
 begin
   Bmp.PixelFormat := pf32Bit;
   bmp.HandleType := bmDIB;
   bmp.ignorepalette := true;
   bmp.alphaformat := afDefined;
   for i := 0 to bmp.Height -1 do
     begin
     pscanLine32 := bmp.Scanline[i];
     for j := 0 to bmp.Width -1 do
        begin
          pscanLine32[j].rgbReserved := Alpha;
          pscanLine32[j].rgbBlue := 0;
          pscanLine32[j].rgbRed := 0;
          pscanLine32[j].rgbGreen := 0;
        end;
     end;
 end;


procedure TForm5.Button1Click(Sender: TObject);
var
  Bmp,bmp2: TBitmap;
  p : TPNGImage;

begin
  Bmp2:=TBitmap.Create;
  bmp2.Width := 300;
  bmp2.height := 300;
  SetAlpha(bmp2,0);
  p:=TPNGImage.Create;
  try
    p.LoadFromFile('C:\Icons\IconCollection\ix_ap_all\48x48\shadow\about.png');

    bmp2.Canvas.Draw(20,20,p);
    bmp2.Canvas.Draw(50,50,p);
    bmp2.Canvas.Draw(150,50,p);
    bmp2.Canvas.Draw(50,150,p);
    Canvas.Draw(100,100,bmp2);
  finally
    bmp2.Free;
    p.Free;
  end;

end;

sportkeks 29. Aug 2012 14:38

AW: Programm Design mit TPNGObject
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ja die Procedure kommt mir bekannt vor die habe ich auf meiner suche auch schon mal gesehen ;)

aber leider kann ich damit nur die Tansparenz des gesamten Tbitmaps einstellen und nicht wie bei PNG einzelne Bereiche

als beispiel: (siehe Anhang)

in der Mitte eher undurchsichtig,...
...aber der "Schein" rings rum faded gemächlich aus.

und so möchte ich es auch haben :cyclops:

aber trotzdem Danke für den Beitrag :thumb:

Bummi 29. Aug 2012 14:42

AW: Programm Design mit TPNGObject
 
Liste der Anhänge anzeigen (Anzahl: 1)
Dann haben wir uns noch nicht richtig verstanden, bei mir sieht es aus wie im Anhang, wie soll es denn aussehen ?

sportkeks 29. Aug 2012 14:53

AW: Programm Design mit TPNGObject
 
ja genau so soll es aussehen !!! aber so bekomme ich es nicht hin :pale: welche Delphi Version nutzt du ????

In turbodelphi gibt es anscheinend kein

Delphi-Quellcode:
bmp.alphaformat := afDefined;
deswegen hat es bei mir auch nie funktioniert :|

aber das wäre dem ziel schon sehr nah :wink:

Bummi 29. Aug 2012 14:57

AW: Programm Design mit TPNGObject
 
Ich verwende XE, von Turbodelphi habe ich keine Ahnung, gegf. kommst Du dort mit GDI+ weiter?

sportkeks 29. Aug 2012 15:08

AW: Programm Design mit TPNGObject
 
davon habe ich schon viel gehört aber mich bis her noch nicht rangetraut, ich habe aber gerade ein prima Tutorial auf Delphitreff dazu gefunden vielleicht bekomme ich das ja hin, ich werde es auf jeden Fall mal versuchen.

Danke für deine Hilfe, falls noch weite Lösungsansätze bestehen bin ich für jeden Vorschlag dankbar :)

sportkeks 29. Aug 2012 17:55

AW: Programm Design mit TPNGObject
 
Okay an einer sache verzweifel ich gerade und zwar möchte ich ganz simpel eigentlich ein TGPBitmap befor ich es in ein TGPCachedBitmap packe vorher resizen.

also:

Delphi-Quellcode:
      Image := TGPBitmap.Create('C:/icon.png');

->>> image.ändere_größe_auf_50x50.... oder so ähnlich ^^ <<<----

      image2:=TGPCachedBitmap.Create(image,graphics);

      try
        for I := 0 to 10 do
          for I2 := 0 to 10 do
          begin
            r.X:=i*50;
            r.Y:=i2*50;
            graphics.DrawCachedBitmap(Image2,r.X,r.y);
          end;
      finally
        image.Free;
        image2.Free;
      end;
Delphi-Quellcode:
image.SetResolution(...

funktioniert leider nicht O.o


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:36 Uhr.
Seite 1 von 3  1 23      

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