Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi 32bit TBitmap nach dem SPeichern ohne Alphachannel? (https://www.delphipraxis.net/180948-32bit-tbitmap-nach-dem-speichern-ohne-alphachannel.html)

Memnarch 2. Jul 2014 14:05

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:
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)
Was läuft hier gerade Falsch?
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

Medium 2. Jul 2014 16:38

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.

himitsu 2. Jul 2014 17:23

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.

Namenloser 2. Jul 2014 19:07

AW: 32bit TBitmap nach dem SPeichern ohne Alphachannel?
 
Zitat:

Zitat von Medium (Beitrag 1264137)
begrenzt evtl. auch noch GIF.

GIF kann nur definieren, dass ein bestimmter Paletteneintrag als „transparent“ gewertet werden soll – das können Bitmaps aber schon lange (TransparentColor). Dazu kommt noch die archaische Limitierung auf 256 Farben... also ich finde nicht, dass GIF hier in irgendeiner Weise „geeignet“ ist, auch nicht begrenzt.

Medium 3. Jul 2014 01:35

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:)

Memnarch 3. Jul 2014 07:47

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:

Zitat von Medium (Beitrag 1264193)
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:)

Bitmap unterstützt auch 8Bit Alpha

Medium 3. Jul 2014 08:45

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:

Zitat von Wikipedia
An integrated alpha channel has been introduced with the undocumented BITMAPV3INFOHEADER and with the documented BITMAPV4HEADER (since Windows 95) and is used within Windows XP logon and theme system as well as Microsoft Office (since v2000); it is supported by some image editing software, such as Adobe Photoshop since version 7 and Adobe Flash since version MX 2004 (then known as Macromedia Flash). It is also supported by GIMP, Google Chrome, Microsoft PowerPoint and Microsoft Word.

For compatibility reasons, most applications use the older DIB headers for saving files. With OS/2 not more supported after Windows 2000, for now the common Windows format is the BITMAPINFOHEADER header.

Der fette Teil dürfte aber, auch wenn diese Erweiterung offenbar prinzipiell existiert, das Problem mit dem Speichern unter Delphi sein. Ich gehe ganz stark davon aus, dass dort auch die alten DIB Header zum Einsatz kommen.
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 Bei Google suchenGraphics32 setzen, oder aber zumindest GDI+, welche beide voll "Alpha-Aware" sind.

himitsu 3. Jul 2014 09:19

AW: 32bit TBitmap nach dem SPeichern ohne Alphachannel?
 
Zitat:

Zitat von Namenloser (Beitrag 1264163)
das können Bitmaps aber schon lange (TransparentColor)

Das können Bitmaps nicht.

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)

noisy_master 3. Jul 2014 13:45

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

Namenloser 3. Jul 2014 14:10

AW: 32bit TBitmap nach dem SPeichern ohne Alphachannel?
 
Zitat:

Zitat von himitsu (Beitrag 1264222)
Zitat:

Zitat von Namenloser (Beitrag 1264163)
das können Bitmaps aber schon lange (TransparentColor)

Das können Bitmaps nicht.

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)

Wurde der nicht mitgespeichert? :gruebel:
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:51 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz