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;