Entwickler-Ecke

Multimedia / Grafik - PNGObject mit Transparenz speichern


Symbroson - Do 01.02.18 20:27
Titel: PNGObject mit Transparenz speichern
Guten Abend,

Ich habe mir von hier [https://github.com/JackTrapper/pngdelphi/] eine PNG implementation herausgesucht. Nur leider kann ich damit keine Bilder mit Tranzparenz zeichnen und dann speichern (Das Zeichnen ist das Problem).
Ich habe bisher die Modi 'COLOR_RGB' und 'COLOR_RGBALPHA' probiert und die zwei verschieden Methoden das Bild zu Zeichnen.
Sich die Deklaration von TPNGObject.CreateBlank mal anzuschauen wäre auch nicht verkehrt - da stehen die Modi, Farbtiefen usw drin.

Liegt das an mir? Wenn ja, was habe ich vergessen? Wenn nicht, kennt jemand eine Andere Bibliothek bei der das so in etwa funktioniert (mit link bitte ;))
Ich habe auch schon einige Varianten gesehen, bei denen das Zeichnen komplett übernommen wurde - Pixel für Pixel - und der Alphakanal separat - das wollte ich eigentlich vermeiden.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
const imgPath : string = 'C:\Users\user\Pictures\temp.png';

{...}

procedure TForm1.OpenPictureDialog1SelectionChange(Sender: TObject);
var png1, png2: TPNGObject;
begin
  Canvas.Rectangle(00, ClientWidth, ClientHeight);
  png1 := TPNGObject.Create;
  png1.LoadFromFile(OpenPictureDialog1.FileName);
  Canvas.StretchDraw(Rect(00, ClientWidth div 2, ClientHeight), png1);
                                             
  {--------------------------------------------------------------------------}

    //COLOR_RGB: schwarzer Hintergrund anstatt Transparenz
    //COLOR_RGBALPHA: komplett weißes Bild
  png2 := TPNGObject.CreateBlank(COLOR_RGB, 16, ClientWidth div 2, ClientHeight);
  //png2.CreateAlpha;

  png1.Draw(png2.Canvas, Rect(00, png2.Width, png2.Height));

  //Canvas.StretchDraw(Rect(ClientWidth div 2, 0, ClientWidth, ClientHeight), png2);
  png2.Draw(Canvas, Rect(ClientWidth div 20, ClientWidth, ClientHeight));

  png2.SaveToFile(imgPath);
  
  png1.Free;
  png2.Free;
end;


Delete - Fr 02.02.18 02:20

- Nachträglich durch die Entwickler-Ecke gelöscht -


Symbroson - Fr 02.02.18 07:59

Vielen Dank :)
gibt trotzdem noch ein kleines Problem:
vorher:vorher nachher:nachher
Wäre cool wenn das mit den Alphakanälen auch funktionierte :) bisher werden alle transparenten Pixel bzw farbige Pixel mit Alphakanal komplett Transparent gespeichert


user profile iconFrühlingsrolle hat folgendes geschrieben Zum zitierten Posting springen:
Bitte hier den try-finally Block anwenden.
wo und wofür genau brauche ich hier den try..finally block?

LG


Delete - Sa 03.02.18 09:12

- Nachträglich durch die Entwickler-Ecke gelöscht -


Symbroson - Sa 03.02.18 10:56

Was try..finally macht war mir schon klar, nur leuchtet mir nicht so ganz ein, warum ich das Objekt nur darin erstellen bzw freigeben soll. Ich versuche ja in meinem richtigen Code schon alles mögliche, dass beim Erstellen des png-Objektes keine Fehler passieren. Nagut vielleicht noch, wenn eine png Datei geladen wird, die gar keibe ist - also entweder umbenannt oder fehlerhaft - dann würde das Ganze Sinn machen. Oder gibt es sonst noch irgendetwas, was die Verwendung des try Blockes empfehlenswert macht?

Wegen dem Alphakanal werde ich mir vmtl mal eine andere Bibliothek heraussuchen - vielleicht auch eine, die auch 24 und 32 bit Bildtiefe unterstützt...

LG


Delete - Sa 03.02.18 12:51

- Nachträglich durch die Entwickler-Ecke gelöscht -


haentschman - So 04.02.18 10:14

Moin... 8)
[OT]
Zitat:
wo und wofür genau brauche ich hier den try..finally block?

...mit dieser Aussage kannst du auch beim Vorstellungsgespäch hinten runter fallen. :lol:
[/OT]


Symbroson - So 04.02.18 10:34

Zitat:
...mit dieser Aussage kannst du auch beim Vorstellungsgespäch hinten runter fallen. :lol:
naja, noch ist ja ein klein wenig Zeit bis dahin ^^


haentschman - So 04.02.18 14:19

Zitat:
naja, noch ist ja ein klein wenig Zeit bis dahin

...dann ist es ja gut. Das war kein Scherz von mir. :P Ich habe meinen ersten Programmierjob bekommen, weil ich im Quellcode des Tests try/finally drin hatte. Der Enwicklungsleiter hat mir damals gesagt, das 80% der Entwickler die sich bewerben (ohne Gewähr) es noch nicht mal kennen. :shock:


Symbroson - Di 06.02.18 20:39

Also ich hab mein Problem jetzt mit GR32 gelöst. Es gibt eine Erweiterung dazu namens GR32_PNG [https://github.com/graphics32/GR32PNG] in deren Github-Repository [https://github.com/graphics32/] inklusive Demo [https://github.com/graphics32/GR32PNG/tree/master/Demo]. Allerdings müsst ihr schon die Standard GR32 Bibliothek [https://github.com/graphics32/graphics32] in Delphi eingebunden haben. Das hatte ich glücklicherweise schon bei AlgoSort [https://www.entwickler-ecke.de/topic_AlgoSort_116675.html] installiert - daher war die Implementation doch recht einfach.

Vielleicht lag es auch ganz einfach daran, dass ich den Zeichenmodus nicht auf dmBlend umgestellt habe - das müsste ich vllt nochmal testen. Auf jeden Fall funktioniert die Transparenz jetzt - und zwar auch mit 32 Bit Bildtiefe. Die andere Bibliothek war ja auf bis zu 16 Bit beschränkt.