64 BPP PNG in TPicture verarbeiten

Für Probleme bezüglich Grafik, Audio, GL, ACS, ...
Antworten
DiBo33
Beiträge: 334
Registriert: Do 11. Okt 2007, 18:01

64 BPP PNG in TPicture verarbeiten

Beitrag von DiBo33 »

Hallo,

ich habe einige Grafiken im PNG-Format mit 64BPP.
Wenn ich diese jetzt in ein TPicture lade, kommt dabei nur Schrott raus (wohl weil TPicture nur bis 32 BPP unterstützt).
Kann ich die irgendwie verlustfrei laden und zur Not in 32 BPP umwandeln?
Dazu müsste ich aber auch wissen, wie ich feststellen kann, ob die Grafik jetzt 64BPP hat.

Gruß

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

Beitrag von theo »

Schon mal mit OPBitmap propiert? Könnte klappen.

DiBo33
Beiträge: 334
Registriert: Do 11. Okt 2007, 18:01

Beitrag von DiBo33 »

Ja, mit V1.6, da geht mir aber die Transparenz flöten.

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

Beitrag von theo »

DiBo33 hat geschrieben:Ja, mit V1.6, da geht mir aber die Transparenz flöten.
Die Alpha Transparenz sollte eigentlich nicht flöten gehen.
Auf GTK sieht man die nur nicht.

DiBo33
Beiträge: 334
Registriert: Do 11. Okt 2007, 18:01

Beitrag von DiBo33 »

Hm, wenn ich die Grafik normal in ein TImage lade, sieht diese zumindest transparent aus, Wenn ich den Weg über TOpPicture gehe ist alles was transparent sein soll schwarz (unabhängig der BPP also auch bei 32BPP).

Code: Alles auswählen

bmp: TOpPicture;
//...
bmp.LoadFromFile(FileName);
AssignOpBitmapToBitmap(bmp.Bitmap, Image1.Picture.Bitmap);
oder kann ich hier noch etwas machen?

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

Beitrag von theo »

Was ist denn das für eine Transparenz? Alpha Kanal?
Häng doch mal das Bild hier an.

DiBo33
Beiträge: 334
Registriert: Do 11. Okt 2007, 18:01

Beitrag von DiBo33 »

theo hat geschrieben:Was ist denn das für eine Transparenz? Alpha Kanal?
Häng doch mal das Bild hier an.
Ich hoffe, ich habs richtig gemacht.
Dateianhänge
gtk-stop.png
gtk-stop.png (8.21 KiB) 1603 mal betrachtet

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

Beitrag von theo »

Naja, das kann GTK einfach so nicht darstellen. Sieht aber tip-top aus auf QT.

Was du machen kannst, ist das Bild zuerst in ein anderes OPBitmap mit einer definierten HG-Farbe alphablenden. Dann ist da wenigstens kein schwarz.

Code: Alles auswählen

procedure TForm1.Button1Click(Sender: TObject);
var OP:TOPPicture;
OPB:TCanvasOPBitmap;
begin
OP:=TOPPicture.Create;
OP.LoadFromFile('/home/theo/download/gtk-stop.png');
OPB:=TCanvasOPBitmap.Create;
OPB.Width:=OP.Bitmap.Width;
OPB.Height:=OP.Bitmap.Height;
OPB.Canvas.Brush.Color:=ColorToRGB(clBtnFace);
OPB.Canvas.FillRect(Rect(0,0,OPB.width,OPB.height));
OP.Bitmap.AlphaBlend:=true;
OPB.Canvas.Draw(0,0,OP.Bitmap);
AssignOpBitmapToBitmap(OPB,Image1.Picture.Bitmap);
OPB.free;
OP.Free;
end;

DiBo33
Beiträge: 334
Registriert: Do 11. Okt 2007, 18:01

Beitrag von DiBo33 »

So habe ich es dann letztendlich auch gemacht.
Schade das die Alphatransparenz so nicht unterstützt wird, dennoch ist das Ergebnis schon sehr zufriedenstellend, jedenfalls gibts jetzt eine ordentliche Scalierung der Icons :)

Danke dir.

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

Beitrag von theo »

DiBo33 hat geschrieben:So habe ich es dann letztendlich auch gemacht.
Dann is ja gut ;-)

Du scheinst ja einen gewissen Forscherdrang zu besitzen und scheinst mittlerweile etwas mit OpBitmap vertraut. Deshalb möchte ich dir kurz die Schwachstelle mitteilen und dich ermutigen, bessere Wege zu finden.
Grundsätzlich sollte alles bis auf Lazbridge stabil bleiben.
OpBitmap und alle Formate basieren auf Pixelarrays und Algorithmen, welche Pascal Standard sind.
Deshalb funktioniert es auch auf Kylix und Delphi. Es benötigt noch nicht mal einen X-Server oder sowas.
Batch Converter oder Server Anwendungen ohne X werden also immer funktionieren (Es sei denn FPC bricht low level mit der Delphi-Compiler Kompatibilität).
Das einzige, und deshalb ist es auch in einer separaten Unit, was den andauernden redesigns der LCL Grafik unterliegt, findest du in lazbrigde.
In deinem Fall ist es nur die Methode AssignOpBitmapToBitmap(..) welche immer wieder auf die Veränderungen "du jour" in der LCL Grafik optimiert werden muss.

Was ich damit sagen will: Falls es in der nächsten Lazarus Version nicht mehr klappen sollte, dann kann man mit 99% Sicherheit davon ausgehen, das der Fehler in lazbridge zu suchen ist. Das ist doch irgendwie Beruhigend ;-)
Ich nehme diesbezüglich gerne Verbesserungsvorschläge entgegen, weil ich da auch nicht immer hinterherkomme.

DiBo33
Beiträge: 334
Registriert: Do 11. Okt 2007, 18:01

Beitrag von DiBo33 »

Ich werde es mir mal zu Gemüte führen, mal sehen evtl. kommt mir ja eine zündende Idee.
Aber versprechen kann ich nichts.

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

Beitrag von theo »

DiBo33 hat geschrieben:Ich werde es mir mal zu Gemüte führen, mal sehen evtl. kommt mir ja eine zündende Idee.
Aber versprechen kann ich nichts.
Das ist OK, ich verspreche auch nie was. ;-)

Nur zu deiner Info: AssignOpBitmapToBitmap ist eigentlich noch viel weniger kompliziert als es aussieht.
Der Teil bei "if Int.DataDescription.BitsPerPixel = 32" ist für QT bzw 32bit Displays, kannste vergessen.
Unten ist
case SourceBitmap.Pixelformat of pf32bit, pf24bit
nur zur Beschleunigung, das könnte ebenso im "else" fall abgehandelt werden.

Antworten