Autor Beitrag
Symbroson
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 326
Erhaltene Danke: 47

Linux Raspbian, Win10
C, C++, Python, Java, JavaScript, Delphi7, Casio Basic
BeitragVerfasst: Do 01.02.18 20:27 
Guten Abend,

Ich habe mir von hier 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.

ausblenden 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;
Einloggen, um Attachments anzusehen!
_________________
most good programmers do programming not because they expect to get paid or get adulation by the public, but because it's fun to program. (Linus Torvalds)
Frühlingsrolle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1979
Erhaltene Danke: 365

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Fr 02.02.18 02:20 
Guten Abend Symbroson,

nachdem png2 erzeugt wurde:

ausblenden Delphi-Quelltext
1:
2:
png2.Transparent := true;
png2.TransparentColor := 0;

Bitte hier den try-finally Block anwenden.

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)

Für diesen Beitrag haben gedankt: Symbroson
Symbroson Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 326
Erhaltene Danke: 47

Linux Raspbian, Win10
C, C++, Python, Java, JavaScript, Delphi7, Casio Basic
BeitragVerfasst: 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
Einloggen, um Attachments anzusehen!
_________________
most good programmers do programming not because they expect to get paid or get adulation by the public, but because it's fun to program. (Linus Torvalds)
Frühlingsrolle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1979
Erhaltene Danke: 365

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Sa 03.02.18 09:12 
Dafür kenn ich mich mit der Bildverarbeitung zu wenig aus.Ich müsste es so wie du durchprobieren, also mal sehen.

Den try-finally Block hast du auch in anderen Sprachen, ebenso in C++. Passiert im try ein Fehler bzw. ein Abbruch, wird der Code im finally dennoch ausgeführt. Darin solltest du die Objekte freigeben um Speicherlecks zu verhindern.

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)
Symbroson Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 326
Erhaltene Danke: 47

Linux Raspbian, Win10
C, C++, Python, Java, JavaScript, Delphi7, Casio Basic
BeitragVerfasst: 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

_________________
most good programmers do programming not because they expect to get paid or get adulation by the public, but because it's fun to program. (Linus Torvalds)
Frühlingsrolle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1979
Erhaltene Danke: 365

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Sa 03.02.18 12:51 
LoadFromFile() könnte mal fehlschlagen, weil die Datei woanders sein könnte, oder sie wird unbenannt, entfernt, was auch immer. So klein das Risiko auch ist, dass etwas passiert, sollte man deswegen auf den Block nicht verzichten.

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)
haentschman
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 282
Erhaltene Danke: 32


DX10 Berlin Professional
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 326
Erhaltene Danke: 47

Linux Raspbian, Win10
C, C++, Python, Java, JavaScript, Delphi7, Casio Basic
BeitragVerfasst: 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 ^^

_________________
most good programmers do programming not because they expect to get paid or get adulation by the public, but because it's fun to program. (Linus Torvalds)
haentschman
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 282
Erhaltene Danke: 32


DX10 Berlin Professional
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 326
Erhaltene Danke: 47

Linux Raspbian, Win10
C, C++, Python, Java, JavaScript, Delphi7, Casio Basic
BeitragVerfasst: Di 06.02.18 20:39 
Also ich hab mein Problem jetzt mit GR32 gelöst. Es gibt eine Erweiterung dazu namens GR32_PNG in deren Github-Repository inklusive Demo. Allerdings müsst ihr schon die Standard GR32 Bibliothek in Delphi eingebunden haben. Das hatte ich glücklicherweise schon bei AlgoSort 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.

_________________
most good programmers do programming not because they expect to get paid or get adulation by the public, but because it's fun to program. (Linus Torvalds)