64 BPP PNG in TPicture verarbeiten
64 BPP PNG in TPicture verarbeiten
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ß
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ß
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).
oder kann ich hier noch etwas machen?
Code: Alles auswählen
bmp: TOpPicture;
//...
bmp.LoadFromFile(FileName);
AssignOpBitmapToBitmap(bmp.Bitmap, Image1.Picture.Bitmap);
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.
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;
Dann is ja gutDiBo33 hat geschrieben:So habe ich es dann letztendlich auch gemacht.

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.
Das ist OK, ich verspreche auch nie was.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.

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.