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)
} ICONDIR, *LPICONDIR;
前面是3个word型变量。第一个是保留位(注释指明,一定是0),第二个为类型变量,Icon因设为1,第三个变量是图片数量,一张Icon中可以包含多个BMP图片,对应下面的多个ICONDIRENTRY结构。每个ICONDIRENTRY结构表示一张BMP图,其结构大小是16Byte。所以ICON头的总大小为:6+16×idCount。
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;
前两个变量指出了图像的大小,由于Icon图片都是长宽相等的,所以一般有16*16,32*32,48*48这几种。
最后一个DWORD变量dwImageOffset,指明对应的BMP文件在整个文件中的偏移。可以用二进制编辑软件打开一个ICON文件后,进行操练。假设某个dwImageOffset值为0X000044E6,移动鼠标到此偏移处,由此开始的一段数据块,就是一个标准的BMP文件了。我们下面就是要通过这种方法,定位BMP文件后,改变BMP文件的颜色等相关属性。
首先确定图像的Index,即它在ICONDIRENTRY列表中的位置,然后找到其BMP文件在ICON文件中的偏移,并定位到此偏移处等待进一步处理。最简单的情况是Icon文件中只有一个Bmp图像,那么Bmp文件的偏移一定总是22。
typedef struct tagBITMAPINFOHEADER { /* bmih */
DWORD biSize;
LONG biWidth;
LONG biHeight;
WORD biPlanes;
WORD biBitCount;
DWORD biCompression;
DWORD biSizeImage;
LONG biXPelsPerMeter;
LONG biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
} BITMAPINFOHEADER;