本文分享&备忘最近了解到的icon资源在windows平台下相关的一部分知识。所有测试代码都尽可能的依赖win32 API实现。通过源码可以了解其结构,同时它们也是可复用的代码积累。

    内容摘要:如何保存exe的图标为*.ico文件、如何遍历PE文件的icon资源并保存为*.ico文件、如何合并多个*.ico文件、如何分割含有多张图片的*.ico文件

一、 保存exe的图标为*.ico文件

    exe在windows shell下的可显示图标有3或者4种,使用win32 API获取它们的ICON handle的代码也很简单,前一篇文章已经说过。这里主要难点是如何根据ico文件的存储格式,把HICON保存为*.ico文件。
    文件格式:icon文件头 + directory entrys + bmp header info and color table + image data + mask data。
    思路:从HICON拿到两个BITMAP HANDLE,从Color HANDLE拿到ICON image data,从MaskHandle拿到mask data,从两HANDLE拿到bmp header 的数据。所有数据拿到后写入文件,循环处理多个HICON。
    256*256 icon的说明:这是windows vista+版本才有的。虽然可以加载保存为png格式的*.ico文件,但是GDI并没有提供直接操作png图片的API,我写的工具保存256 * 256 icon图片为BMP格式,会比较大。注意到在directory entry中各只有一个字节保存icon的的长、宽,所以256*256的图片该位置的值是0。

二、抽取PE文件的icon资源

     使用EnumResourceNames枚举到资源,通过CreateIconFromResourceEx从资源获取到HICON,之后就是HICON到*.ico的过程。也可以尝试加个icon文件头后直接把资源写入到文件(我未做测试验证)。
     枚举PE文件所有*.ico资源的HICON的详细代码:https://github.com/cswuyg/icon_tool/blob/master/enum_pe_all_icons/model/enum_all_icons.cc

三、合并*.ico文件

    这里不需要涉及资源API,纯粹是文件数据操作。
    思路:把所有*.ico文件的数据读取出来,再把数据按照一个*.ico文件的格式找位置写到一个文件里。我的做法是先读取每个源文件的前6个字节,拿到了所有图片的数量,算出directory entry的占用的size,这样就可以定位到目标文件图片实际数据的初始位置,后面再循环处理一个个ico文件,写入图片数据和entry。小工具不暂考虑一个源文件被读两次的性能问题~

四、分割含有多张图片的*.ico文件

    这里也不需要涉及资源API,纯粹是文件数据操作。
    思路:读取*.ico文件头的前6个字节,拿到图片个数,循环读取对应的directory entry和图片数据,把新的*ico文件头、新的directory entry、图片数据写入到新的独立目标文件。

五、工具release

1、找出EXE的所有windows shell可显示icon,并保存到一个*.ico文件中;

2、找出PE文件的所有icon,并按组保存;

3、合并*.icon文件;

4、将*icon中的图片一个个分割保存;

工具所在:https://github.com/cswuyg/icon_tool/tree/master/tool%20release

代码project:https://github.com/cswuyg/icon_tool

本文所在:http://www.cnblogs.com/cswuyg/p/3619687.html

六、参考资料

1、Icon资源详解[1]:http://www.cnblogs.com/cswuyg/p/3603707.html

2、不错的代码资源:http://chironexsoftware.com/blog/?p=26 ; http://chironexsoftware.com/blog/?p=30

Icon资源详解[2]的更多相关文章

  1. Icon资源详解[1]

    本文分享&备忘最近了解到的icon资源在windows平台下相关的一部分知识,所有测试代码都尽可能的依赖win32 API实现.更全面的知识,参考文末列出的”参考资料“.      关键字:I ...

  2. VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解)

    上一节讲了标签控件Tab Control以后,常用控件的内容就全部讲完了,当然并没有包括所有控件,主要是一些很常用很重要的控件.本节开始鸡啄米将为大家讲解菜单的概念及使用. 菜单简介 菜单在界面设计中 ...

  3. VS2010-MFC(菜单:VS2010菜单资源详解)

    转自:http://www.jizhuomi.com/software/210.html 上一节讲了标签控件Tab Control以后,常用控件的内容就全部讲完了,当然并没有包括所有控件,主要是一些很 ...

  4. Android下的xml资源详解

    最近遇到的bitmap资源 <?xml version= "1.0" encoding ="utf-8"?> <bitmap xmlns:an ...

  5. kubernetes系列08—service资源详解

    本文收录在容器技术学习系列文章总目录 1.认识service 1.1 为什么要使用service Kubernetes Pod 是有生命周期的,它们可以被创建,也可以被销毁,然而一旦被销毁生命就永远结 ...

  6. 2、puppet资源详解

    定义puppet资源 puppet资源抽象 资源定义 每一个资源有一个type.一个title和一个属性集合(attribute) type {'title':   //type表示资源类型,  ti ...

  7. Java使用wait() notify()方法操作共享资源详解_java - JAVA

    文章来源:嗨学网 敏而好学论坛www.piaodoo.com 欢迎大家相互学习 Java多个线程共享资源: 1)wait().notify()和notifyAll()方法是本地方法,并且为final方 ...

  8. Kubernetes-Ingress资源详解

    什么是Ingress #阿里云称之为ingress路由!在 Kubernetes 集群中,主要用于接入外部请求到k8s内部,Ingress是授权入站连接到达集群服务的规则集合,为您提供七层负载均衡能力 ...

  9. Kubernetes-Service资源详解

    service的三种工作模式:(userstats(效率低).iptables.ipvs) service可以自动实现负载均衡.service自动实现了负载均衡,service通过selector标签 ...

随机推荐

  1. 网站和Web应用程序的区别

    新建项目里面的(ASP.NET Web 应用程序)主要是做B/S系统的,与winform的开发方式类似.新建网站(ASP.NET 网站)是主要开发网站的.其实你只要跟着教程做就行了.具体区别如下(借鉴 ...

  2. 夺命雷公狗-----React---13--事件监听

    在react中事件监听直接作为组建的属性来添加即可,就像DOM中的html操作 <!DOCTYPE> <html> <head> <meta charset= ...

  3. Python 时间和日期模块的常用例子

    获取当前时间的两种方法 import datetime,time now = time.strftime("%Y-%m-%d %H:%M:%S") print now now = ...

  4. Linq To Sqlite 一一二二

    说在前头 之所以写下这些文字,主要是因为使用LINQ的同志们都觉它的美好(至于有多美好,各位心里知道,我就不在描述了,如果你是你还不了解LINQ,园子里有大把的文章),微软老哥只提供了自家的SQLSe ...

  5. ubuntu登陆出现问题

    手贱改了用户root权限结果登陆时提示system administrator is not allowed to login from this screen(郁闷勒) 这时可以按ctrl+F2进入 ...

  6. RunTime的一些用法

    RunTime的一些用法   RunTime简介 RunTime简称运行时.OC就是运行时机制,其中最主要的是消息机制 对于OC来说,在编译的时候并不能决定真正调用哪个函数,只有真正运行时才会根据函数 ...

  7. python开发进阶之路(一)

    哎!好久没有写博客了,怪想念的,今天听了偶像的讲解,好多以前感觉很模糊的概念今天一下子就明朗了.下面就来整理一下今天的收获 一.如何成为一名优秀的开发人员 1.1  得先对自己使用的开发语言了如指掌, ...

  8. 34、JS/AJAX

      1)回顾JS中核心内容 2)了解WEB1.0和WEB2.0时代的技术与特点 3)理解AJAX的产生背景.工作原理与特点 4)掌握AJAX常用API及应用   声明:服务端使用Servlet技术 一 ...

  9. 游戏引擎PushButtonEngine简介

    PushButtonEngine是一个开源的模块化游戏引擎,你可以通过https://github.com/PushButtonLabs/PushButtonEngine得到其代码和相关文档.下面我将 ...

  10. WebForm水印照片

    水印照片需要的元素 绘制:1.画布2.画笔 样式 粗细 颜色3.画什么东西4.用什么字体画 大小5.位置 展示页面 <%@ Page Language="C#" AutoEv ...