C++ Schauen ob Icon compressed ist.

Hi,

ich google schon eine ganze Weile und finde nichts brauchbares. Ich will ein *.ico file, was ich vorher geöffnet habe überprüfen, ob und wenn ja welches Format compressed ist. Ich weiß,
dass das mit dem BITMAPINFOHEADER geht... würde das theoretisch so machen:

Code:
BITMAPINFOHEADER bih;
		
bool isCompressed = ( bih.biCompression != BI_RGB && bih.biCompression != BI_BITFIELDS );

mein Problem ist jetzt: Wie komme ich an den BITMAPINFOHEADER vom *.ico file? Kann mir da jemand helfen?

Also theoretisch müsste man das ja auch für jedes einzelne Format im *.ico auslesen können, oder? Hat da jemand mehr Ahnung von Fileheadern als ich?
 
Hi,
vorweg muss ich sagen, dass ich garkeine Ahnung von Fileheadern habe.
Aber mich hat es grade gewundert, das du eine *.ico Datei wie eine Bitmap behandelst. Denn *.ico's haben eine option, transparente Fraben zu speichern und können sowohl Binär als auch ASCII (ja, das hab ich alles aus IrfanView ^^) codiert werden, was du auch schon angesprochen hast. Aber Bitmaps haben diese Funktion nicht, also gehe ich mal ganz blöd davon aus, dass die unterschiedlich strukturiert sind und nicht gleich behandelt werden können, oder? Naja, vieleicht erkennt windows (is glaub ich n API aufruf?) von selbst, dass es ein *.ico ist.
Aber wie gesagt, ich hab nicht viel Ahnung davon... xD
 
So weit ich weiß sind nur die Riesenicons (256×256) von Vista komprimiert (PNG). Alle anderen sind unkomprimiert und haben ein bmp-ähnliches Format. Der Infoheader werden wohl die ersten Bytes sein. Falls es keine passende API gibt, nimm doch einfach fopen oder ähnliches um das zu lesen. Vielleicht findest du hier noch ein paar Informationen:
http://msdn2.microsoft.com/en-us/library/ms997538.aspx
 
Ja es geht um das Vista-Icon. Der Link wird mir helfen denke ich. Danke erstmal.

EDIT:
also ich mache das jetzt so:
Code:
typedef struct
{
   BITMAPINFOHEADER   icHeader;      // DIB header
   RGBQUAD         icColors[1];   // Color table
   BYTE            icXOR[1];      // DIB bits for XOR mask
   BYTE            icAND[1];      // DIB bits for AND mask
} ICONIMAGE, *LPICONIMAGE;

...

ICONIMAGE ii;
icoFile.Read( &ii, sizeof( ii ) );
			
BITMAPINFOHEADER bih = ii.icHeader;
bool isCompressed = ( bih.biCompression != BI_RGB && bih.biCompression != BI_BITFIELDS );
if(isCompressed)
{
    ...
}
leider funktioniert das noch nicht so ganz.. irgendwie bekomme ich immer zurückgegeben, dass das icon compressed ist.

beim debuggen ist biCompression immer was >=10000.. aber BI_RGB und BI_BITFIELDS sind ja als 0 bzw 3 definiert.
Hatda jemand ne Idee, was ich falsch mache? icoFile ist ein CAtlFile...

EDIT2: Okay, jetzt hab ichs.. man muss vorher noch an die richtige Stelle im header "browsen" mit
Code:
icoFile.Seek(icoEntry.dwImageOffset, FILE_BEGIN);

Danke an alle, die geholfen haben. Thema kann geschlossen werden.
 
Zurück
Oben