图标文件格式之彩色图标

【字号: 日期:2022-07-04浏览:34作者:雯心

图标文件格式之彩色图标

在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的颜色设置成你想要的其他任意颜色.

相关文章: