PNG Transparenz?

Für Probleme bezüglich Grafik, Audio, GL, ACS, ...
Antworten
Targion
Beiträge: 688
Registriert: Mi 3. Okt 2007, 21:00
OS, Lazarus, FPC: Linux (L 0.9.29 FPC 2.4.2)
CPU-Target: x86_64

PNG Transparenz?

Beitrag von Targion »

Hallo!
Mit folgendem Code:

Code: Alles auswählen

var bt: TPortableNetworkGraphic;buf:TPortableNetworkGraphic;
begin
 bt:=TPortableNetworkGraphic.Create;
 bt.TransparentColor:=clWhite;
 bt.TransparentMode:=tmAuto;
 bt.Transparent:=true;
 bt.LoadFromFile('../left.png');
 buf:=TPortableNetworkGraphic.Create;
 buf.TransparentColor:=clWhite;
 buf.TransparentMode:=tmAuto;
 buf.Transparent:=true;
 buf.Width:=bt.Width;
 buf.Height:=bt.Height;
 buf.Canvas.Draw(0,0,bt);
 bt.LoadFromFile('../lastrow.png');
 buf.Width:=buf.Width+bt.Width;
 buf.Canvas.Draw(buf.Width-bt.Width,0,bt);
 bt.Free;
 buf.SaveToFile('./xyz.png');
end;
Will ich den Inhalt von 2 PNG-Grafiken aneinanderfügen. Das Ergebnis ist allerdings nicht mehr transparent, so wie es die ursprünglichen Grafiken waren, stattdessen ist der Hintergrund schwarz oder schwarz-weiß gestreift. (Sieht irgendwie dreckig aus)
Wie kann ich die Transparenz beibehalten? Ich benutze Lazarus 0.9.27, eine entwas ältere SVN-Version.

Benutzeravatar
theo
Beiträge: 10871
Registriert: Mo 11. Sep 2006, 19:01

Re: PNG Transparenz?

Beitrag von theo »

Auf welchem System / Widgetset bist du?
Häng mal die Grafiken an.

Targion
Beiträge: 688
Registriert: Mi 3. Okt 2007, 21:00
OS, Lazarus, FPC: Linux (L 0.9.29 FPC 2.4.2)
CPU-Target: x86_64

Re: PNG Transparenz?

Beitrag von Targion »

Widgetset: GTK2
System: Linux Kernel 2.6.28-r5, Ubuntu
Die grafiken sind Teile des Linux-Compatibilty-Buttons des Listaller-Projektes (der Button zeigt an, welche Linux-Distributionen eine Anwendung unterstützt)
(Beispiel des gewünschten Ergebnisses soll so oder wie dieses aussehen. Die beiden Bilder sind gegimpt, sollen aber von der Lazarus-Anwendung automatisch erstellt werden.)
Die entsprechenden Testgrafiken sind im Anhang.
Dateianhänge
First liButton cells
First liButton cells
firstrow.png (658 Bytes) 1389 mal betrachtet
Left part of liButton
Left part of liButton
left.png (8.61 KiB) 1389 mal betrachtet

Benutzeravatar
theo
Beiträge: 10871
Registriert: Mo 11. Sep 2006, 19:01

Re: PNG Transparenz?

Beitrag von theo »

Hab's angeschaut. Ich kapier auch nie ganz was da passiert in der LCL.
Mit OPbitmap geht's, falls das für dich eine Option ist. Resultat im Anhang. Mit folgendem Code:

Code: Alles auswählen

uses Opbitmapformats
 
procedure TForm1.Button2Click(Sender: TObject);
var bt1,bt2,res:TPNGImage;
begin
bt1:=TPNGImage.Create;
bt2:=TPNGImage.Create;
res:=TPNGImage.Create;
bt1.LoadFromFile('left.png');
bt2.LoadFromFile('firstrow.png');
res.Width:=bt1.Width+bt2.Width;
res.Height:=bt1.Height;
res.Canvas.Draw(0,0,bt1);
res.Canvas.Draw(bt1.Width,0,bt2);
res.SaveToFile('xyz.png');
res.free;
bt1.free;
bt2.free;
end; 
 
 
Dateianhänge
xyz.png
xyz.png (9.96 KiB) 1380 mal betrachtet

Targion
Beiträge: 688
Registriert: Mi 3. Okt 2007, 21:00
OS, Lazarus, FPC: Linux (L 0.9.29 FPC 2.4.2)
CPU-Target: x86_64

Re: PNG Transparenz?

Beitrag von Targion »

Danke theo, klasse Sache! (Du hast mir jetzt schon 2 mal richtig gut geholfen :mrgreen: )
Also warum der Code jetzt geht, dass verstehe ich allerdings wirklich nicht. Aber naja, Hauptsache es geht. Um das "Warum?" kümmere ich mich mal, wenn mir richtig langweilig ist. Die LCL ist schon manchmal merkwürdig.... Wie bist du auf diese Lösung gekommen?

Benutzeravatar
theo
Beiträge: 10871
Registriert: Mo 11. Sep 2006, 19:01

Re: PNG Transparenz?

Beitrag von theo »

Targion hat geschrieben:Wie bist du auf diese Lösung gekommen?
Naja, vielleicht weil ich OpBitmap geschrieben habe... :oops:

Targion
Beiträge: 688
Registriert: Mi 3. Okt 2007, 21:00
OS, Lazarus, FPC: Linux (L 0.9.29 FPC 2.4.2)
CPU-Target: x86_64

Re: PNG Transparenz?

Beitrag von Targion »

Ah!
Eine Frage hätte ich aber noch: Wenn ich bt2 für ein anderes Bitmap verwende und den Button neu zeichne, geht die alte zeichen-information verloren, d.h. der gesamte Inhalt wird gelöscht. Warum? Muss ich jetzt für jedes weitere Bild auch ein weiteres objekt erstellen? Die "Draw"-Methode sollte das neue Bild doch eigentlich richtig hinzuzeichnen.

Benutzeravatar
theo
Beiträge: 10871
Registriert: Mo 11. Sep 2006, 19:01

Re: PNG Transparenz?

Beitrag von theo »

Ich weiss jetzt nicht genau was du meinst, aber wenn du die Dimensionen des OpBitmaps änderst, wird der Inhalt gelöscht.
Du kannst den Inhalt aber in ein neues mit anderen Dimensionen kopieren.

Targion
Beiträge: 688
Registriert: Mi 3. Okt 2007, 21:00
OS, Lazarus, FPC: Linux (L 0.9.29 FPC 2.4.2)
CPU-Target: x86_64

Re: PNG Transparenz?

Beitrag von Targion »

Ah, ich glaube, das ist der Grund. Danke!

Antworten