AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi 32bit TBitmap nach dem SPeichern ohne Alphachannel?
Thema durchsuchen
Ansicht
Themen-Optionen

32bit TBitmap nach dem SPeichern ohne Alphachannel?

Ein Thema von Memnarch · begonnen am 2. Jul 2014 · letzter Beitrag vom 4. Jul 2014
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Memnarch
Memnarch

Registriert seit: 24. Sep 2010
737 Beiträge
 
#1

32bit TBitmap nach dem SPeichern ohne Alphachannel?

  Alt 2. Jul 2014, 14:05
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
Da man Trunc nicht auf einen Integer anwenden kann, muss dieser zuerst in eine Float kopiert werden
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.679 Beiträge
 
Delphi 2007 Enterprise
 
#2

AW: 32bit TBitmap nach dem SPeichern ohne Alphachannel?

  Alt 2. Jul 2014, 16:38
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.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.139 Beiträge
 
Delphi 12 Athens
 
#3

AW: 32bit TBitmap nach dem SPeichern ohne Alphachannel?

  Alt 2. Jul 2014, 17:23
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#4

AW: 32bit TBitmap nach dem SPeichern ohne Alphachannel?

  Alt 2. Jul 2014, 19:07
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.
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.679 Beiträge
 
Delphi 2007 Enterprise
 
#5

AW: 32bit TBitmap nach dem SPeichern ohne Alphachannel?

  Alt 3. Jul 2014, 01:35
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 )
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Benutzerbild von Memnarch
Memnarch

Registriert seit: 24. Sep 2010
737 Beiträge
 
#6

AW: 32bit TBitmap nach dem SPeichern ohne Alphachannel?

  Alt 3. Jul 2014, 07:47
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:
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 )
Bitmap unterstützt auch 8Bit Alpha
Da man Trunc nicht auf einen Integer anwenden kann, muss dieser zuerst in eine Float kopiert werden
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.679 Beiträge
 
Delphi 2007 Enterprise
 
#7

AW: 32bit TBitmap nach dem SPeichern ohne Alphachannel?

  Alt 3. Jul 2014, 08:45
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 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.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)

Geändert von Medium ( 3. Jul 2014 um 08:49 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.139 Beiträge
 
Delphi 12 Athens
 
#8

AW: 32bit TBitmap nach dem SPeichern ohne Alphachannel?

  Alt 3. Jul 2014, 09:19
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)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
noisy_master

Registriert seit: 17. Jun 2009
Ort: Wolfenbüttel/Baddeckenstedt
255 Beiträge
 
Delphi XE5 Professional
 
#9

AW: 32bit TBitmap nach dem SPeichern ohne Alphachannel?

  Alt 3. Jul 2014, 13:45
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
Dirk
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#10

AW: 32bit TBitmap nach dem SPeichern ohne Alphachannel?

  Alt 3. Jul 2014, 14:10
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?
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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:15 Uhr.
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