1. 0000. Erst
RIFF: danach die Größe der Datei als DWORD, Zusammen 8 Byte.
Hinweis die Länge der Datei angaben, kann unterschiedlich sein!
A: die tatsächliche Länge der Datei.
B: die Länge der Datei abzüglich der 8 Bytes für RIFF u. das DWORD für
die Längeangabe.
2. 0008.
ACON: Dieser Teil kann folgendes enthalten.
Optional!
LIST: Länge als DWORD bis
"anih" ohne die 4 Bytes der Längenangabe
von
LIST. Die Daten können sein:
Optional!
INAM: Größe vom Titel als DWORD ohne die 4 Bytes der Längenangabe, dann Daten.
Hinweis es kann
"INFO" davor stehen!
Optional!
IART: Länge vom Autor als DWORD ohne die 4 Bytes der Längenangabe, dann Daten.
anih: Größe vom Ani-Header-Struktur als DWORD maximal 36 Byte, dann die
Struktur mit 36Byte. Deren erster Wert das DWORD ist mit der Größe der
Struktur = 36 Byte. (Siehe Ani-Header Struktur).
rate: Größe vom Rate als DWORD. Daten in DWORDs.
Optional kann auch die Angabe von
"rate" sein! Womit die
Geschwindigkeit des Bildwechsel, feiner eingestellt werden kann, muß
aber nicht sein. Da in der Ani-Header-Struktur
(ANIHEADER.iDispRate)
schon ein Standartwert für die Geschwindigkeit eingetragen wird!
Nach der Längen Angabe. Also bei Hex 10 = 16
Byte, folgen noch 4 DWORDs = 16 Byte.
Beispiel: Das Ani hat 4 Bilder, dann folgt nach
"rate" ein DWORD mit einer
Hex-Zahl 10 = 16 Byte, die Länge als DWORD!
Nach diesen DWORD folgen für jedes Bild ein DWORD was die
Geschwindigkeit des Bildwechsel angibt. Die unterschiedlich sein können.
ZB. Für 4 Bilder 0000 0011, 0000 0011, 0000 0011, 0000 0011.
oder: für 4 Bilder 0000 0011, 0000 0030, 0000 0050, 0000 0018.
seq: Größe vom Sequenz Block als DWORD, Daten in DWORDs.
Optional kann auch die Angabe von
"seq" sein! Womit die Reihenfolge
der Bilder angeben wird in der Animation bevor die Animation wiederholt wird.
ZB. 5 Bilder sind tatsächlich in der Datei
(ANIHEADER.nFrames = 5) im
ANIHEADER.nSteps = 8 stehen 8 Bilder. Die Länge von
"seq" wäre dann
Hex 20 = 32 Byte = 8 DWORD. Die Anordnung der Bilder könnte sein
Bild 1, Bild1, Bild2, Bild3, Bild4, Bild1, Bild2, Bild5 dann wird die Reihe
wiederholt. Wenn die Reihenfolge der Bild 1,2,3,4,5 wäre, dann braucht man
eigentlich keinen
"seq" Block. Wenn im
ANIHEADER.nSteps mehr Bilder
stehen als im
ANIHEADER.nFrames dann ist der
"seq" Block
zwingend erforderlich! Der dann natürlich die Größe der Anzahl der Bilder
entsprechen muss,
z.B. 8 Bilder * 4 Bxte(=1DWORD) = 32 Byte = Hex 20 = 8 DWORDs.
Weiterhin wenn dazu noch der
"rate" Block verwendet
werden soll, muss der
"rate" Block die gleiche Größe
wie der
"seq" Block haben, also auch 32 Byte = 8 DWORDs!
Ein DWORD für jedes anzuzeigendes Bild.
3.
LIST: Länge des Restes der Datei, als DWORD, Ab dieser Längenangabe, also nach
diesem DWORD.
fram:
icon: Größe der Bild-Daten nach diesem DWORD, dann Daten.
(Erstes Bild)
Hinweis! In der Größenangabe werden die Größen der beiden Cursor-Strukturen,
die BITMAPINFOHEADER-Struktur, die Farbtabelle und das XOR- so wie das
AND-Bild zusammengerechnet. Also ab hier bis zum nächsten
"icon"
frame, oder das Ende der Datei wenn es das lezte Bild ist.
Der icon Block enthält nach der Größenangabe.
A: die Struktur CURHEADER mit der Größe ist 6 Byte.
(siehe CURHEADER Struktur).
B: die Struktur CURSORDIEENTRY mit der Größe ist 16 Byte.
(siehe CURSORDIEENTRYR Struktur)
C: die Struktur BITMAPINFOHEADER mit der Größe ist 40 Byte.
(siehe BITMAPINFOHEADER Struktur)
D: Farbtabelle (Farbenzahl * 4 Byte)
E: Bilddaten des Cursors erst das XOR-Bild dann das AND-Bild
........
........
(usw.)
........
icon: Größe der Bild-Daten nach diesem DWORD, dann Daten.
(Letztes Bild)
Hinweis! In der Größenangabe werden die Größen der beiden Cursor-Strukturen,
die BITMAPINFOHEADER-Struktur,
die Farbtabelle und das XOR- so wie das AND-Bild zusammengerechnet.
Also ab hier bis zum Ende der Datei.
Der icon Block enthält nach der Größenangabe.
A: die Struktur CURHEADER mit der Größe ist 6 Byte.
(siehe CURHEADER Struktur)
B: die Struktur CURSORDIEENTRY mit der Größe ist 16 Byte.
(siehe CURSORDIEENTRYR Struktur)
C: die Struktur BITMAPINFOHEADER mit der Größe ist 40 Byte.
(siehe BITMAPINFOHEADER Struktur)
D: Farbtabelle (Farbenzahl * 4 Byte)
E: Bilddaten des Cursors erst das XOR-Bild dann das AND-Bild
In C
Struct
ANIHEADER {
DWORD cbSize; // Größe der Struktur in Bytes.
DWORD nFrames; // Anzahl von Bildern (auch bekannt als frames)die gespeichert
// sind in der Datei.
DWORD nSteps; // Die Anzahl von anzuzeigenden Bildern, bevor die Animation wiederholt
// wird. Die Anzahl kann durchaus größer sein als die vorhandenen Bilder.
// Dann muss der
"seq" Block vorhanden sein. (Siehe oben
"seq")
DWORD iWidth; // Breite vom Bild (in pixels)
DWORD iHeight; // Höhe vom Bild (in pixels)
DWORD iBitCount; // Anzahl der Bits pro Pixel( Anzahl der Farben) 1= Schwartz-Weis = 8 Byte,
// 4 = 16 Farben = 64 Byte, 8 = 256 Farben = 1024 Byte,
// 24 = 16 Millionen Farben (keine Farbtabelle)
DWORD nPlanes; // Anzahl der Farbebenen
DWORD iDispRate; // Standartwert Geschwindigkeit für Bildwechsel (gemessen in 1/60th-von-
// einer Sekunde)
DWORD bfAttributes; // ANI attribute bit flags Bei 1 sind die Bilder als Icon oder Cursor
// gespeichert, bei 0 als Bitmap und 3 bedeutet das, daß ein
"seq"-
// Block im Header vorhanden ist.
};
Struct CURHEADER {
WORD wReserved; // Always 0
WORD wResID; // Always 2
WORD wNumImages; // Number of cursor images/directory entries
};
Struct CURSORDIRENTRY {
BYTE bWidth; // Breite des Bildes
BYTE bHeight; // Die doppelte Höhe des Bildes in Pixeln.
BYTE bColorCount; // Anzahl der Farben im Bild (2 oder 16, bzw. 0 falls mehr
// als 256 Farben).
BYTE bReserved; // immer 0
WORD wHotspotX; // X-Position des Hotspots.
WORD wHotspotY; // Y-Position des Hotspots
DWORD dwBytesInImage; // Bildgröße in Bytes ab diesem Record. Das bedeutet
// BITMAPINFOHEADER, Farbtabelle,
// XOR- und AND-Bild zusammen gerechnet.
DWORD dwImageOffset; // Offset ab da, wo der BITMAPINFOHEADER beginnt.
};
struct ICOHEADER {
WORD wReserved; // Always 0
WORD wResID; // Always 1
WORD wNumImages; // Number of icon images/directory entries
};
struct ICONDIRENTRY {
BYTE bWidth; // Breite des Bildes
BYTE bHeight; // Die doppelte Höhe des Bildes in Pixeln.
BYTE bColorCount; // Anzahl der Farben im Bild (2 oder 16, bzw. 0 falls mehr als
BYTE bReserved; // 256 Farben). immer 0
WORD wPlanes; // Anzahl der Farbebenen in der Regel 1 u. 0
WORD wBitCount; // Anzahl der Bits pro Pixel( Anzahl der Farben) 1= Schwarz-
// Weiß = 8 Byte, 4 = 16 Farben = 64 Byte,
// 8 = 256 Farben = 1024 Byte, 24 = 16 Milion
// Farben (keine Farbtabelle)
DWORD dwBytesInImage; // Bildgröße in Bytes ab diesem Record. Das bedeutet
// BITMAPINFOHEADER, Farbtabelle, XOR- und
// AND-Bild zusammen gerechnet.
DWORD dwImageOffset; // Offset ab wo der BITMAPINFOHEADER beginnt.
};
struct BITMAPINFOHEADER {
DWORD biSize; // Länge des Info-Headers(dieser Record) = 40 Byte in Hex 28
LONG biWidth; // Breite des Bildes
LONG biHeight; // Höhe des Bildes
WORD biPlanes; // Anzahl der Farbebenen in der Regel 1 u. 0
WORD biBitCount; // Anzahl der Bits pro Pixel( Anzahl der Farben) 1= Schwartz-
// Weiß = 8 Byte, 4 = 16 Farben = 64 Byte,
// 8 = 256 Farben = 1024 Byte, 24 = 16 Milion
// Farben (keine Farbtabelle)
DWORD biCompression; // Komprimierungstyp, 0 = Unkomprimiert, 1 = 8-Bit
// RLE =Run-Length-Encording-Verfahren, 2 = 4-Bit Run-Encording-
// Verfahren
DWORD biSizeImage; // Bildgröße ohne Farbtabelle. Aber XOR und AND Bild zusammen
// gerechnet bei Icon u. Cursor.
DWORD biXPelsPerMeter; // Horizontale Auflösung
DWORD biYPelsPerMeter; // Vertikale Auflösung
DWORD biClrUsed; // Die Zahl der im Bild vorkommenden Farben zB. Bei 256 Farben
// müssen es nicht unbedingt 256 sein, es könne auch
// zB. 206 sein.
DWORD biClrImportant; // die Anzahl der wichtigen Farben
} ;
Ein paar Beispiele in Delphi
PResourceCurHeader = ^TResourceCurHeader;
RESOURCE_CURHEADER = packed record
wReserved: WORD ; // Always 0
wResID: WORD ; // Always 2
wNumImages: WORD; // Anzahl der Einträge im Directory
end; TResourceCurHeader =
RESOURCE_CURHEADER;
PCursorDirentry = ^TCursorDirentry;
CURSORDIRENTRY = packed record
Width: Byte;
bHeight: Byte;
bColorCount: Byte;
bReserved: Byte;
wHotspotX: WORD;
wHotspotY: WORD;
dwBytesInImage: DWORD;
dwImageOffset: DWORD;
end; TCursorDirentry =
CURSORDIRENTRY;
PBitmapInfoHeader = ^TBitmapInfoHeader;
BITMAPINFOHEADER = packed record
biSize: DWORD;
biWidth: Longint;
biHeight: Longint;
biPlanes: Word;
biBitCount: Word;
biCompression: DWORD;
biSizeImage: DWORD;
biXPelsPerMeter: Longint;
biYPelsPerMeter: Longint;
biClrUsed: DWORD;
biClrImportant: DWORD;
end;
TBitmapInfoHeader =
BITMAPINFOHEADER;