Delphi-PRAXiS

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

Neumann 29. Aug 2012 20:50

AW: Programm Design mit TPNGObject
 
Liste der Anhänge anzeigen (Anzahl: 1)
Habe mir für solche Dinge einen Designer gebaut, damit kann ich leicht angepasste Programmoberflächen bauen und auch von Anderen machen lassen, die weder programmieren können noch den Quellcode kennen.

Alle Objekte auf dem Bild sind klickbar und habe etliche Eigenschaften, die man mit einer Art Objectinspector setzen und auch zu Programmlaufzeit ändern kann.

Bummi 29. Aug 2012 22:15

AW: Programm Design mit TPNGObject
 
zu Deinem GP-Problem gibt es bei
http://www.delphipraxis.net/169251-g...dunkler-2.html
einiges zum nachlesen ...

sportkeks 30. Aug 2012 09:39

AW: Programm Design mit TPNGObject
 
@Bummi
okay vielen dank aber ich sehe leider noch nicht ganz wie mir das weiter helfen soll,
ich möchte keine Pages aus einer tif Datei extrahieren, ich möchte gerne ein PNG in ein TGPCachedBitmap speichern und vorher Höhe und Breite festlegen.

Denn beim Zeichnen mit

Delphi-Quellcode:
graphics.DrawCachedBitmap(cachedimage,pos_x,pos_y);


bleibt mir keine möglichkeit die größe zu verändern wäre ja auch recht sinnlos wenn ein TGPCachedBitmap erst immer wieder angepasst werden müsste.

@Neumann
wie sieht es bei deinem Designer mit der Performance aus ? Speziel beim Resizen der Form (ich zeichne ja aus den Bildern das Design des ganzen Programms) sprich wenn viele Images in der Größe und Position angepasst werden müssen ?
Und vor allem auf welche Komponenten greifst du zurück? GDI ? PNGDelphi ? delphi 32 ? oder was ganz anderes ?

Gruß

Der Keks

Bummi 30. Aug 2012 10:01

AW: Programm Design mit TPNGObject
 
Die entscheidenden Zeilen waren
Delphi-Quellcode:
dest := TGPBitmap.Create(MulitFrameImage.GetWidth,
      MulitFrameImage.GetHeight, PixelFormat16bppRGB565);
g := TGPGraphics.Create(dest);
g.DrawImage(MulitFrameImage, MakePoint(0, 0));
wobei Größe ,gewünschtes Pixelformat und MulitFrameImage von Dir zu setzen sind.

Also Du erzeugst ein TGPBitmap mit den von Dir gewünschten Parameters, erzeugst dann ein TGPGraphics mit diesem TGPBitmap als "Zeichenfläche", der Rest wie immer ....

sportkeks 30. Aug 2012 11:01

AW: Programm Design mit TPNGObject
 
Vielen vielen Dank!!!

Jetzt funktioniert es!!

Das ist ja der Hammer wie flott das geht mit TGPCachedBitmap lässt sich echt ne menge Performance raus holen

you made my day :thumb:
*nichtvorhandenenbedankbuttondrück*

Gruß

Der Keks

Neumann 30. Aug 2012 12:53

AW: Programm Design mit TPNGObject
 
@Sportkeks

Ich verwende eine etwas modifiziere Form der Komponente TSimplegraph. Die Performance ist sehr gut. Ein Simplegraph kann über seinen Zoom-Faktor selbst skalieren; alle Objekte werden dann in Größe und Position angepasst.

Der grosse Vorteil ist, dass man Programmoberflächen wie mit einem Malprogramm erstellen kann, wenn das eigentliche Programm darauf eingerichtet ist.

Ich verwende die Sache jetzt noch relativ speziell für unsere Programme, werde aber mal was allgemein Verwendbares bauen; kann aber noch etwas dauern.

Bummi 30. Aug 2012 13:18

AW: Programm Design mit TPNGObject
 
@Neumann
dafür gibt es bei GDI SetWorldTransform und bei GDI+ einen ganzen Stapel von Matrizenfunktionen

Neumann 30. Aug 2012 13:35

AW: Programm Design mit TPNGObject
 
@Bummi

Versteh ich jetzt nicht.

sportkeks 30. Aug 2012 14:20

AW: Programm Design mit TPNGObject
 
Also im allgemeinen kann ich sagen das meine ursprüngliche Frage geklärt ist aber Interessenhaltshalber würde ich gerne mal sehn was du mit dem Designer schon alles auf die Beine gestellt hast vllt ist es ja eine gute alternative

sportkeks 1. Sep 2012 12:11

AW: Programm Design mit TPNGObject
 
@Neumann

Möchtest du uns deine Creationen nicht zeigen ?

schade -.-

Neumann 1. Sep 2012 20:22

AW: Programm Design mit TPNGObject
 
@Sportkeks Doch, werde ich machen. Dauert aber noch ein paar Tage.


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