Atari Logo
Atari Computer

Hauptseite -
Welches System? -
Hardware -
Software -
Emulatoren -
Internet
MausNet
Programmieren
Verweise
Über

Dateiformate

Home Resourcen Resourcen Konfigurationen

2.1.1 Windows Iconformat

Extension: .ICO

Ein Icon kann unterschiedliche Bilddaten in unterschiedlichen Auf­lö­sun­gen undd Farbtiefen enthalten.

Header:

typedef struct
{
   WORD         idReserved;   /* Reserved (must be 0) */
   WORD         idType;       /* Resource Type (1 for icons) */
   WORD         idCount;      /* How many images? */
   ICONDIRENTRY idEntries[1]; /* An entry for each image
                                 (idCount of 'em) */
} ICONDIR, *LPICONDIR;

Der Wert idCount gibt an, wieviel Bilder im Icon enthalten sind. Die Größe von des Feldes idEntries ist durch idCount bestimmt. Für jedes Bild existiert ein ICONDIRENTRY.

ICONDIRENTRY:

typedef struct
{
   BYTE  bWidth;        /* Width, in pixels, of the image */
   BYTE  bHeight;       /* Height, in pixels, of the image */
   BYTE  bColorCount;   /* Number of colors in image (0 if >=8bpp) */
   BYTE  bReserved;     /* Reserved ( must be 0) */
   WORD  wPlanes;       /* Color Planes */
   WORD  wBitCount;     /* Bits per pixel */
   DWORD dwBytesInRes;  /* How many bytes in this resource? */
   DWORD dwImageOffset; /* Where in the file is this image? */
} ICONDIRENTRY, *LPICONDIRENTRY;

Für jeden ICONDIRENTRY gibt es ein Iconimage. Der Wert dwBytesInRes gibt die Größe der Bilddaten in Byte an, der Wert dwImageOffset liefert die Position ab Dateianfang.

Bilddaten:

typdef 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;

Die Kompenente icHeader ist vom Typ DIB BITMAPINFOHEADER. Nur die folgenden Komponenten werden benutzt: biSize, biWidth, biHeight, biPlanes, biBitCount, biSizeImage. Alle anderen Komponenten werden auf 0 gesetzt. Die Komponente biHeight gibt die Höhe der XOR und AND Maske zusammen an. Die Komponenten von icHeader definieren den Inhalt und die Größe der anderen Elemente der ICONIMAGE Struktur genauso wie BITMAPINFOHEADER eine DIB definiert.

Die Komponente icColors ist ein Feld von RGBQUADs. Die Anzahl der Elemente in diesem Feld wird durch icHeader bestimmt.

Die Komponeten icXOR@ enthält die DIB Bits für die XOR Maske des Bildes. Die Anzahl Bytes ist durch icHeader bestimt. Die XOR Maske ist der Farbanteil, Die Maske wird per XOR in die Quelle kopiert, nachdem die AND Maske in die Quelle kopiert wurde.

Die Komponente icAND enthält die Bits für die monochrome AND Maske. Die Anzahl Bytes ist durch icHeader bestimmt. Die Größe ist dieselbe wie die XOR Maske. Die AND Maske wird per AND in die Quelle kopiert bevor die XOR Maske kopiert wird.

<b>Bem.:b> Die Komponente biHeight der Struktur icHeader ist die Höhe der XOR und AND Maske zusammen. Diese Zahl muß deshalb durch 2 geteilt werden, bevor mit ihr die beiden Masken bearbeitet werden. Die AND Maske ist eine monochrome DIB mit einer Farbtiefe von 1 bpp.

Beispielsource (Ausschnitt):

/* We need an ICONDIR to hold the data */
pIconDir = malloc( sizeof( ICONDIR ) );
/* Read the Reserved word */
ReadFile( hFile, &(pIconDir->idReserved), sizeof( WORD ),
          &dwBytesRead, NULL );
/* Read the Type word - make sure it is 1 for icons */
ReadFile( hFile, &(pIconDir->idType), sizeof( WORD ),
          &dwBytesRead, NULL );
/* Read the count - how many images in this file? */
ReadFile( hFile, &(pIconDir->idCount), sizeof( WORD ),
          &dwBytesRead, NULL );
/* Reallocate IconDir so that idEntries has enough room for
   idCount elements */
pIconDir = realloc( pIconDir,
                    ( sizeof( WORD ) * 3 ) +
                    ( sizeof( ICONDIRENTRY ) * pIconDir->idCount ) );
/* Read the ICONDIRENTRY elements */
ReadFile( hFile, pIconDir->idEntries,
          pIconDir->idCount * sizeof(ICONDIRENTRY),
          &dwBytesRead, NULL );
/* Loop through and read in each image */
for (i=0;i<pIconDir->idCount;i++)
{
   /* Allocate memory to hold the image */
   pIconImage = malloc( pIconDir->idEntries[i].dwBytesInRes );
   /* Seek to the location in the file that has the image */
   SetFilePointer( hFile, pIconDir->idEntries[i].dwImageOffset,
                   NULL, FILE_BEGIN );
   /* Read the image data */
   ReadFile( hFile, pIconImage, pIconDir->idEntries[i].dwBytesInRes,
             &dwBytesRead, NULL );
   /* Here, pIconImage is an ICONIMAGE structure. Party on it :) */
   /* Then, free the associated memory */
   free( pIconImage );
}
/* Clean up the ICONDIR memory */
free( pIconDir );

Windows kennt keine Einschränkungen in der Größe der Icons. Man findet üblicherweise Größen von 16, 32, and 48 Quadratpixel. Deshalb sollten mindestens folgende Größen in einem Icon enthalten sein:

Cursors:

Cursors ähneln sehr stark Icons. Wenn in idType auch der Wert von 2 für Cursor zugelassen ist, lassen sich auch Cursors laden.


Home Resourcen Resourcen Konfigurationen


Best viewed with any browser English version not yet available.

Änderungen und Irrtümer vorbehalten. Letzte Änderung:
14 September 2001.
Home - Mail an den Webmaster - Impressum