本文分享&备忘最近了解到的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. Struts2(二):工作原理

    struts可查看源码:https://github.com/apache/struts 在学习struts2之前,我先看了一些比较早版本对struts2的工作原理相关的介绍,顺便抄写过来,用来帮助自 ...

  2. Talend 从Excel导入Saleforce数据(一) 直接从salesforce lookup 性能的噩梦

    速度的瓶颈是在查询Sales force是否有该电话号码的联系人资料. TMap属性的 lookup Model, 如果用Load Once, 则会把SaleForce的contact全部load下来 ...

  3. 0518 Scrum项目5.0

    一,组员任务完成情况 首页设计初步完成但是需要优化界面,只能简单的输出信息和在首页进行登录.界面极其简单. 鸡汤版面设计有困难,问题在于用何种形式来管理用户的数据上传,但是经过小组间的讨论确定设计方向 ...

  4. .naturalWidth 和naturalHeight属性,

    在HTML 5中,新增加了两个用来判断图片的宽度和高度的属性,分别为 .naturalWidth 和naturalHeight属性,例子如下: var rw = myimage.naturalWidt ...

  5. 浅析firmware完整生存和使用流程 【转】

    转自:http://blog.csdn.net/zhenwenxian/article/details/4677604 浅析firmware完整生存和使用流程 1. http://blog.china ...

  6. 如何做个简单安卓App流程

    有同学做毕业设计,问怎样做个简单安卓App流程,我是做服务端的,也算是经常接触app,想着做app应该很简单吧,不就做个页面,会跳转,有数据不就行了,我解释了半天,人家始终没听懂,算了,我第二天问了下 ...

  7. SPOJ 375. Query on a tree (树链剖分)

    Query on a tree Time Limit: 5000ms Memory Limit: 262144KB   This problem will be judged on SPOJ. Ori ...

  8. Android动画Drawable Animation

    Drawable Animation是逐帧动画,那么使用它之前必须先定义好各个帧.我们可以通过代码定义,也可以使用xml文件定义,一般使用后者.如下: <?xml version="1 ...

  9. <转>关闭 程序崩溃时 windows 正在检查该问题的解决方案

    本文转自:http://www.cnblogs.com/dabaopku/archive/2011/07/04/2097029.html 尤其是使用visual studio开发程序 ,自己特意thr ...

  10. Linux下内存占用和CPU占用的计算

    ->使用free命令查看内存使用情况: 1.echo 3 > /proc/sys/vm/drop_caches 2.free 或者使用cat /proc/yourpid/status 来查 ...