要合并icon,就要明白ICON文件的格式。
首先是文件头。由于一个ico文件可以包含多个icon,为了表示的方便,就在文件头部用了一个目录结构 ICONDIR:
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
} ICONDIR, *LPICONDIR
前三项分别是保留区,类型标识和icon个数。第四项开始就是一个ICONDIRENTRY的数组,每个数组元素将对应一个icon。当然,icon数据不是存储在这个ICONDIRENTRY里面的。下面就是ICONDIRENTRY的结构:
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;
可见,在这个ICONDIRENTRY中定义了icon的一些基本信息,dwImageOffset指向真正的icon数据,它标记了icon数据在此图标文件中的偏移位置。icon数据区的大小记录在dwBytesInRes中。
那么,icon图像数据又是怎么存储的呢?它由下面的结构表示,ICONIMAGE :
typdef struct
{
BITMAPINFOHEADER icHeader; // DIB header
RGBQUAD icColors[1]; // Color table
BYTE icXOR[1]; // DIB bits for XOR mask
BYTE icAND[1]; // DIB bits for AND mask
} ICONIMAGE, *LPICONIMAGE;
每个icon图像有一个和bmp文件一样的DIB头,有一张颜色表,然后就是图像数据的掩码。再来一个个分析这些结构,下面是 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;
在icon数据中的BITMAPINFOHEADER只用到了其中的 biSize,biWidth,biHeight,biPlanes,biBitCount,biSizeImage,其它的成员必须赋值为0。其中 biSize表示了该结构体需要的字节数,一般就是40(但也有例外,可能采用BITMAPV4HEADER或者BITMAPV5HEADER)。 biHeight在这里是像素高度的两倍,因为是XOR掩码区和AND掩码区高度之和。biBitCount取值范围是 0,1,4,8,16,24,32。我处理256色的icon,这里取值就是8。biSizeImage表示掩码数据区的大小(XOR和AND)。有了BITMAPINFOHEADER信息,就可以定位颜色表,地址为
icColors= ((LPSTR)pIconImage + (WORD)(pIconImage ->icHeader.biSize))
然后再来看颜色表的格式,RGBQUAD:
typedef struct tagRGBQUAD {
BYTE rgbBlue;
BYTE rgbGreen;
BYTE rgbRed;
BYTE rgbReserved;
} RGBQUAD;
颜色表的大小取决于icon文件中所用到的颜色数(icHeader.biBitCount),对于24位或者32位色的图像就不需要用到颜色表了。
定位了颜色表并且知道了颜色表的大小就可以算出XOR掩码和AND掩码的地址。掩码的应用规则如下:
0 | n | 显示icColors[n]指定的颜色 |
1 | 0 | 透明 |
1 | 非0 | 屏幕反色 |
一个完整的icon文件结构如下:
--------------------Begin Of File
IconDir
idReserved
idType
idCount
idEntries[0] //ICONDIRENTRY
bWidth
bHeight
bColorCount
bReserved
wPlanes
wBitCount
dwBytesInRes
dwImageOffset
...
...
idEntries[idCount-1] //ICONDIRENTRY
bWidth
bHeight
bColorCount
bReserved
wPlanes
wBitCount
dwBytesInRes
dwImageOffset
--------------------IconDir结束,图片数据开头
IconImage 1
icHeader
biSize
biWidth
biHeight
biPlanes
biBitCount
biCompression
biSizeImage
biXPelsPerMeter
biYPelsPerMeter
biClrUsed
biClrImportant
icColors[256] //假设是32x32的256色的icon
icXOR[1024] //32x32
icAND[128] //32x32/8每个像素之要1bit
...
...
IconImage idCount-1
icHeader
biSize
biWidth
biHeight
biPlanes
biBitCount
biCompression
biSizeImage
biXPelsPerMeter
biYPelsPerMeter
biClrUsed
biClrImportant
icColors[256] //假设是32x32的256色的icon
icXOR[1024] //32x32
icAND[128] //32x32/8每个像素之要1bit
-------------------End Of File
相关推荐
总的来说,解析APK获取icon图标是一项涉及文件I/O、XML解析和资源提取的技术任务,通过纯Java实现可以提高代码的灵活性,但需要对Android应用的内部结构有较深入的理解。在实现过程中,可能需要对不同的操作系统环境...
- ICO文件的结构解析,解释为何它可以包含多个尺寸的图像。 - 如何在Windows系统中设置和更改图标。 - 图标文件的兼容性问题,比如在不同操作系统下的表现。 - 图标设计的基本原则,包括分辨率、颜色和尺寸的考虑。 ...
- **文件格式解析**:理解ICO文件的二进制结构,包括图像的数量、大小、位深度等信息。 - **图像编码**:学习如何将RGB或RGBA像素数据编码为ICO文件所需的格式。 - **图像处理**:可能需要实现图像缩放、裁剪、颜色...
2. **解析PNG压缩数据**:PNG文件的数据是经过压缩的,工具需要解码这些数据以得到原始的像素值。 3. **转换到ICO格式**:ICO文件结构与PNG不同,它需要包含多个不同尺寸的图像,以适应不同的显示需求。PNG2ICON...
《EasyUi图标扩展库:1700+精美小图标解析》 EasyUi是一个轻量级的JavaScript框架,专门用于构建用户界面,尤其在企业级Web应用中广泛应用。其核心特性在于提供了一套完整的UI组件,包括表格、树形结构、下拉菜单等...
OTS(Open Table Service)是大规模分布式NoSQL数据库,适合处理海量半结构化数据;还有Redis、MongoDB等云数据库服务,满足不同业务需求。 3. **域名与网站**:阿里云DNS服务提供了稳定快速的全球域名解析,帮助...
《jQuery仿淘宝icon动画图标特效详解》 在网页设计中,动态效果往往能提升用户体验,增强视觉吸引力。本文将深入探讨一款基于jQuery实现的“仿淘宝icon动画图标特效”。这款特效巧妙地运用了jQuery框架,当鼠标悬停...
《Labview程序Tray Icon详解》 Labview(Laboratory Virtual Instrument Engineering Workbench)是一款由美国国家仪器公司(National Instruments)开发的图形化编程环境,主要用于创建数据采集、仪器控制和测试...
要解码“icon.pak”文件,你需要使用专门的解包工具,这些工具可以解析pak文件的内部结构,并将其内容导出为可编辑的图像格式。例如,你可以寻找名为“Pak Explorer”或者“FS Packer”的第三方软件,它们能帮助你...
**ExtJS Icon Combobox详解** 在Web开发领域,ExtJS是一个强大的JavaScript库,它提供了丰富的组件和工具,用于构建复杂的用户界面。其中,Icon Combobox是ExtJS中的一个特色组件,将图标与下拉列表结合,提升了...
标题 "xwiki-rendering-transformation-icon-3.3.1.zip" 暗示这是一个与XWiki渲染转换相关的软件包,版本为3.3.1。XWiki是一款开源的、可扩展的、基于Java的wiki平台,其核心功能包括文档编辑、版本控制以及自定义...
通过阅读源码,可以学习到如何使用C++进行文件操作,如何解析二进制文件结构,以及如何与Windows API交互来处理图标资源。 这个压缩包中的"ExtractIcon"可能是源码文件夹,包含了实现这些功能的源代码文件,如`.cpp...
首先,我们需要理解Vue3项目的目录结构。在Vue CLI创建的项目中,通常会在`public`目录下的`index.html`文件中找到`link`标签,用于设置应用的图标。例如,这样的代码片段: ```html <link rel="icon" href=...
3. **找到图标**: 在资源结构中找到图标资源,通常需要遍历资源目录,根据资源类型(RT_ICON)和ID来定位图标。 4. **解码图标数据**: 图标数据是二进制格式,包含多个不同尺寸和颜色深度的图像。需要使用特定的...
这通常通过解析EXE或DLL的结构来获取。 了解以上知识点后,开发者可以根据Icon Changer的源码学习如何在自己的Delphi项目中处理资源,尤其是图标资源,实现类似的功能。这对于定制化应用的外观,或者批量修改图标等...
下面将详细讨论PE文件结构以及解析过程。 1. **PE文件结构**: - **DOS头**:PE文件起始于一个简化的MS-DOS头,使得在不支持PE格式的MS-DOS环境下,程序也能执行简单的操作。 - **PE头**:DOS头之后是PE标志,...
1. **资源解析**:软件通过读取系统和程序文件的资源部分,提取其中的图标信息。这涉及到对PE(Portable Executable)文件结构的理解,以及对资源ID和类型码的识别。 2. **索引构建**:为了加快搜索速度,软件会建立...
1. **Icon格式详解**: - **文件结构**:ICO文件是一种包含一个或多个不同尺寸和颜色深度的位图图像的容器。每个图像都有自己的大小标签,这样系统可以根据需要选择最适合当前环境的图像。 - **支持格式**:ICO...
本文将深入探讨PE资源图标解析的相关知识点,帮助读者理解PE文件中图标资源的结构、存储方式以及如何进行解析。 首先,我们来了解PE文件的基本结构。PE文件由头文件(Header)和节区(Section)组成,头文件包含了...