分类分类
2014-11-04 16:19作者:下载吧
在ICO图标中的彩色图像和单色图像的格式基本上是一样的,唯一的区别就是image位图是彩色的了,但是掩码依旧是单色,对于掩码来说无论image部分是多少bpp的像素,掩码一直都是1bpp的,并且每行的像素数据必须是4字节对齐存储的,主要是因为CPU读取的时候可以加快速度,一次读4字节.
在ICONDIRENTRY, ICONDIRENTRY之后保存就是图像数据了,图像格式包含了一个BITMAPINFOHEADER数据结构,其结构定义如下:
typedef struct tagBITMAPINFOHEADER{
DWORD biSize;
LONG biWidth;
LONG biHeight;
WORD biPlanes;
WORD biBitCount;
DWORD biCompression;
DWORD biSizeImage;
LONG biXPelsPerMeter;
LONG biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
} BITMAPINFOHEADER, *PBITMAPINFOHEADER;
*其中biWidth是图像的宽度,biHeight是图像实际显示高度的两倍,要注意到这并不是一个标准的位图格式,因为它包含了掩码,以致于变成两倍高度.
图标有一个限制,它只支持4bpp, 8bpp, 16bpp, 32bpp,去不支持24bpp,对于彩色图标,biCompression支持BI_RGB和BI_BITFIELDS.
*图片的绘制也是按数学坐标轴的方式从下往上绘制的,即:
pixel = (screen AND mask) XOR image
*然而对于彩色像素来说,异或操作并不是有意义的操作,比如说在8bpp上,蓝色异或淡黄褐色等于杏黄色,而在32bpp上等于#FOEA29.唯一有意义的是和黑色作异或,你会得到"对于任意颜色Q来说,黑色 XOR Q = Q".
mask image 结果 操作
0 Q (screen AND 0) XOR Q = Q 图标的像素
1 0 (screen AND 1) XOR 0 = screen 不变
1 Q (screen AND 1) XOR Q = screen XOR Q 不确定
要使像素透明,你要把掩码设置成白色,并且image为黑色,而要使用来自于图标中的像素,则mask设置成黑色,image的颜色设置成你想要的其他任意颜色.
相关教程