`
zhaole609
  • 浏览: 342842 次
  • 性别: Icon_minigender_1
  • 来自: 河南
社区版块
存档分类
最新评论

icon结构解析

阅读更多

icon合并 – 文件结构

要合并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掩码的地址。掩码的应用规则如下:

AND掩码 XOR掩码 规则
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图标兼容linux和window

    总的来说,解析APK获取icon图标是一项涉及文件I/O、XML解析和资源提取的技术任务,通过纯Java实现可以提高代码的灵活性,但需要对Android应用的内部结构有较深入的理解。在实现过程中,可能需要对不同的操作系统环境...

    PNG与ICON图片互转工具

    - ICO文件的结构解析,解释为何它可以包含多个尺寸的图像。 - 如何在Windows系统中设置和更改图标。 - 图标文件的兼容性问题,比如在不同操作系统下的表现。 - 图标设计的基本原则,包括分辨率、颜色和尺寸的考虑。 ...

    ICON图标文件的制作软件源代码

    - **文件格式解析**:理解ICO文件的二进制结构,包括图像的数量、大小、位深度等信息。 - **图像编码**:学习如何将RGB或RGBA像素数据编码为ICO文件所需的格式。 - **图像处理**:可能需要实现图像缩放、裁剪、颜色...

    PNG2ICON图片转换工具

    2. **解析PNG压缩数据**:PNG文件的数据是经过压缩的,工具需要解码这些数据以得到原始的像素值。 3. **转换到ICO格式**:ICO文件结构与PNG不同,它需要包含多个不同尺寸的图像,以适应不同的显示需求。PNG2ICON...

    EasyUi icon扩展小图标.rar

    《EasyUi图标扩展库:1700+精美小图标解析》 EasyUi是一个轻量级的JavaScript框架,专门用于构建用户界面,尤其在企业级Web应用中广泛应用。其核心特性在于提供了一套完整的UI组件,包括表格、树形结构、下拉菜单等...

    阿里云拓扑ICON图标矢量素材

    OTS(Open Table Service)是大规模分布式NoSQL数据库,适合处理海量半结构化数据;还有Redis、MongoDB等云数据库服务,满足不同业务需求。 3. **域名与网站**:阿里云DNS服务提供了稳定快速的全球域名解析,帮助...

    jQuery仿淘宝icon动画图标特效

    《jQuery仿淘宝icon动画图标特效详解》 在网页设计中,动态效果往往能提升用户体验,增强视觉吸引力。本文将深入探讨一款基于jQuery实现的“仿淘宝icon动画图标特效”。这款特效巧妙地运用了jQuery框架,当鼠标悬停...

    Labview程序tray icon.rar

    《Labview程序Tray Icon详解》 Labview(Laboratory Virtual Instrument Engineering Workbench)是一款由美国国家仪器公司(National Instruments)开发的图形化编程环境,主要用于创建数据采集、仪器控制和测试...

    街头篮球icon.pak解码

    要解码“icon.pak”文件,你需要使用专门的解包工具,这些工具可以解析pak文件的内部结构,并将其内容导出为可编辑的图像格式。例如,你可以寻找名为“Pak Explorer”或者“FS Packer”的第三方软件,它们能帮助你...

    icon combobox

    **ExtJS Icon Combobox详解** 在Web开发领域,ExtJS是一个强大的JavaScript库,它提供了丰富的组件和工具,用于构建复杂的用户界面。其中,Icon Combobox是ExtJS中的一个特色组件,将图标与下拉列表结合,提升了...

    xwiki-rendering-transformation-icon-3.3.1.zip

    标题 "xwiki-rendering-transformation-icon-3.3.1.zip" 暗示这是一个与XWiki渲染转换相关的软件包,版本为3.3.1。XWiki是一款开源的、可扩展的、基于Java的wiki平台,其核心功能包括文档编辑、版本控制以及自定义...

    icon图标提取类及工具源码

    通过阅读源码,可以学习到如何使用C++进行文件操作,如何解析二进制文件结构,以及如何与Windows API交互来处理图标资源。 这个压缩包中的"ExtractIcon"可能是源码文件夹,包含了实现这些功能的源代码文件,如`.cpp...

    vue3修改link标签默认icon无效问题详解

    首先,我们需要理解Vue3项目的目录结构。在Vue CLI创建的项目中,通常会在`public`目录下的`index.html`文件中找到`link`标签,用于设置应用的图标。例如,这样的代码片段: ```html <link rel="icon" href=...

    从 DLL、EXE 或资源文件中解开 ICON(3KB)

    3. **找到图标**: 在资源结构中找到图标资源,通常需要遍历资源目录,根据资源类型(RT_ICON)和ID来定位图标。 4. **解码图标数据**: 图标数据是二进制格式,包含多个不同尺寸和颜色深度的图像。需要使用特定的...

    Icon Changer delphi 源码

    这通常通过解析EXE或DLL的结构来获取。 了解以上知识点后,开发者可以根据Icon Changer的源码学习如何在自己的Delphi项目中处理资源,尤其是图标资源,实现类似的功能。这对于定制化应用的外观,或者批量修改图标等...

    pe文件解析:读取pe信息获取文件资源(源码)

    下面将详细讨论PE文件结构以及解析过程。 1. **PE文件结构**: - **DOS头**:PE文件起始于一个简化的MS-DOS头,使得在不支持PE格式的MS-DOS环境下,程序也能执行简单的操作。 - **PE头**:DOS头之后是PE标志,...

    Icon 图标疯狂搜索 V1.0

    1. **资源解析**:软件通过读取系统和程序文件的资源部分,提取其中的图标信息。这涉及到对PE(Portable Executable)文件结构的理解,以及对资源ID和类型码的识别。 2. **索引构建**:为了加快搜索速度,软件会建立...

    icon格式的图标

    1. **Icon格式详解**: - **文件结构**:ICO文件是一种包含一个或多个不同尺寸和颜色深度的位图图像的容器。每个图像都有自己的大小标签,这样系统可以根据需要选择最适合当前环境的图像。 - **支持格式**:ICO...

    PE资源图标解析

    本文将深入探讨PE资源图标解析的相关知识点,帮助读者理解PE文件中图标资源的结构、存储方式以及如何进行解析。 首先,我们来了解PE文件的基本结构。PE文件由头文件(Header)和节区(Section)组成,头文件包含了...

Global site tag (gtag.js) - Google Analytics