![]() |
32bit TBitmap nach dem SPeichern ohne Alphachannel?
Moin,
Ich habe keine Probleme damit 32Bit Bitmaps zu laden, zur laufzeit zu erzeugen und/oder Transparent zu zeichnen, das geht alles ohne probleme(AUch zugriffe für einzelne komponennten von RGBA). Heute habe ich eine 32Bit Bitmap speichern wollen. Windows zeigt unter Eigenschaften 32Bit an, in Gimp ist aber z.B. kein Alphachannel vorhanden. Einfaches Beispiel:
Delphi-Quellcode:
Was läuft hier gerade Falsch?
LBitmap := TBitmap.Create();
LBitmap.SetSIze(50, 50); LBitmap.PixelFormat := pf32Bit; LBitmap.AlphaFormat := afDefined;//hab hier afDefinded, afIgnored ausprobiert, zu anfangs die Zeile auch weggelasen) LBitmap.SaveToFile('Foo.bmp) PS: Ich kann in einer Bitmap wie oben gezeigt ein TIcon packen, die Bitmap dann wieder in ein TIcon wandeln, dies Speichern und das Icon ist vollkommen Ok. Zur laufzeit scheint also alles in TBitmap vorhanden zu sein. auch die RGBA komponentnen sehen in ordnung aus. PSS: Ich nutze Delphi XE Grüße Memnarch |
AW: 32bit TBitmap nach dem SPeichern ohne Alphachannel?
Ich vermute mal ganz stark, dass Delphi hier auf die GDI Funktionen von Windows setzt, und da ist kein Alpha-Kanal für vorgesehen. Ich meine sogar zu glauben, dass das Format BMP generell keinen Alphakanal definiert, und dass das 32-Bit Bitmap im Wesentlichen entstanden ist, weil es bei 24 Bit günstiger aligned ist zum laden auf 32-Bit Systemen. Um Bilder mit Transparenz zu speichern, böten sich eher Formate wie PNG, TIFF oder TGA an - begrenzt evtl. auch noch GIF.
|
AW: 32bit TBitmap nach dem SPeichern ohne Alphachannel?
Jupp, Bitmap hat eigentlich keine Transparenz
Wenn das 4. Byte zumindestens gespeichert und geladen würde, dann wäre das erstmal egal und man müsste die entgültige Behandlung einfach von einer Komponente vornehmen lassen, welche dieses Byte als Transparenz behandelt. |
AW: 32bit TBitmap nach dem SPeichern ohne Alphachannel?
Zitat:
|
AW: 32bit TBitmap nach dem SPeichern ohne Alphachannel?
Bei GIF ist dies aber immerhin Teil der Spezifikation, und jeder halbwegs ordentliche Loader (und "Saver") wird dies unterstützen - im Gegensatz zur Verwendung des "freien" Bytes bei 32 Bit BMPs. Natürlich ist das dann ein "1 Bit Alpha", und 255 verbleibende Farben. Aber es gibt durchaus Fälle, in denen das völlig ausreicht. Ob dies so ist oder nicht, muss Memnarch selbst entscheiden. (In ein 16x16 Icon würden sogar maximal 256 Farben überhaupt möglich sein :stupid:)
|
AW: 32bit TBitmap nach dem SPeichern ohne Alphachannel?
Aber natürlich kann Bitmap auch transparenz! Seht ihr z.B. an den optionen in Gimp. Was meint ihr den was in einem Icon steht? EIne bitmap ohne BitmapFileHeader(ersten 6 Bytes).
Wen Delphi beim schreiben natürlich mist baut beim Speichern isses doof :( EDIT: Zitat:
|
AW: 32bit TBitmap nach dem SPeichern ohne Alphachannel?
Bei einem Icon hätte ich jetzt gesagt, dass dies eher an den Spezifikationen des ICO Formats liegt, dass die BMP Datenstruktur mit benutzt. Aber ich muss mich teilweise korrigieren:
Zitat:
Wenn es also BMP sein muss, dann müsstest du entweder eine Lib auftun, die die neuen Header nutzt (ich kenne spontan keine), oder das Speichern selber implementieren. Vielleicht kann GDI+ da auch was, aber die ist eigentlich abgekündigt. Und immer damit rechnen, dass andere Programme von der Transparenz nichts sehen, oder gar mit dem ganzen Bild nichts mehr anfangen können. (Die oben genannten gehen ja zumindest schon mal.) Edit: Ich habe auch schon Probleme mit Delphis TBitmap bekommen, wenn dort Alpha mit enthalten sein sollte. Wenn ich mich richtig erinnere, zerschießen manche API Funktionen den Kanal ab und zu. Ich würde daher eher voll auf eine Lib wie die ![]() |
AW: 32bit TBitmap nach dem SPeichern ohne Alphachannel?
Zitat:
Die Image-Anzeige kann einen zusätzlichen Wert, der aber nicht im Bitmap gespeichert ist, verwenden, für die Transparenz. (frei definierbarer Farbwert oder die Farbe eines bestimmten Pixels) |
AW: 32bit TBitmap nach dem SPeichern ohne Alphachannel?
Moin,
das .bmp Format kann(zwar nicht offiziell, aber immerhin) 32 bpp, also inkl. Alpha Kanal. Das Problem dürfte eher an TBitmap liegen, welches IMHO nur RGB kann. Ich habe aber genau diesen Anwendungsfall auch gehabt(musste ARGB Images anzeigen) und habe dazu die TImgView32 aus der schon weiter oben erwähnten graphics32 genutzt...funktioniert wunderbar(sogar mit mehreren übereinandergelegten TImgView32). Gruß Dirk |
AW: 32bit TBitmap nach dem SPeichern ohne Alphachannel?
Zitat:
Naja, ich hab schon ewig nichts mehr als Bitmap gespeichert. Vielleicht hat mich das PNG-Format schon zu sehr eingenommen, dort gibt es nämlich zusätzlich zum Alpha-Kanal auch so eine 1-Bit-Transparenz über eine wählbare Farbe, und die wird definitiv auch abgespeichert. Diese Eigenschaft heißt bei TPNGImage TransparentColor. Was Bitmaps mit Alpha-Kanal angeht, weiß ich nur, dass es „offiziell“ keine solchen gibt. Es gibt Bitmaps mit 4 Farbkanälen, allerdings ist der 4. „reserved“, d.h. man kann sich nicht unbedingt darauf verlassen, dass er als Alpha-Kanal interpretiert wird. Viele Anwendungen machen es trotzdem oder tun es optional. Was die GDI macht, weiß ich nicht. Ich habe für sowas immer Graphics32 genommen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:16 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz