本文分享&备忘最近了解到的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. JAVA NIO系列(四) 选择器

    前面介绍过Channel.Buffer,后面的文章主要讲解Selector的实践以及实现原理,选择器的概念比起通道.缓冲区要复杂一些,并且选择器是NIO中最重要的一部分内容. 为什么使用Selecto ...

  2. Bug测试报告--连连看——天天向上

    测试时间:2016-11-23 20:10 测试者:刘芳芳(nice!团队) 代码地址:HTTPS:https://git.coding.net/jx8zjs/llk.git SSH:git@git. ...

  3. 解决连接VPN后无法上网问题

    解决连接VPN后无法上网问题 VPN的英文全称是“Virtual Private Network”,翻译过来就是“虚拟专用网络”.顾名思义,虚拟专用网络可以把它理解成是虚拟出来的企业内部专线. 在公司 ...

  4. 在win 7 vs2013下 web 调试 出现“ iis Express Worker Process 已停止工作”错误

    在win 7 vs2013下 web 调试 出现“ iis Express Worker Process 已停止工作”错误: 如下图:   最终解决方案如下: 用管理员身份运行CMD,输入netsh  ...

  5. ASP.NET MVC学习系列(一)-WebAPI初探

    由于即将要接手的新项目计划用ASP.NET MVC3来开发,所以最近一段时间一直在看相关的书或文章.因为之前在大学里也曾学习过MVC2开发,也做过几个简单的MVC2的小型测试项目,不过在后来工作以后主 ...

  6. jade报错:unexpected token

    背景:项目在执行gulp命令构建的时候报了jade错误,错误位置指向的是一个空白行,而这个空白行的上下文都是一些注释,错误信息显示unexpected token "pipeless-tex ...

  7. Less 使用指南

    简而言之 Less是为了简化css http://less.bootcss.com/features/ 以上链接是Less中文网站,里面有对Less的详细介绍. 一下写在使用中遇到的问题: 1.下载L ...

  8. [问题2014S12] 复旦高等代数II(13级)每周一题(第十二教学周)

    [问题2014S12]  设 \(A,B\) 都是 \(n\) 阶半正定实对称阵, 证明: \(AB\) 的所有特征值都是非负实数. 进一步, 若 \(A,B\) 都是正定实对称阵, 证明: \(AB ...

  9. python 中date datetime time 与str的互转

    以下全部引入 form datetime import datetime, timedelta import time 一.time 转str 二.datetime 转 str str_date = ...

  10. 【转载】jQuery1.5之后的deferred对象详解

    原文:http://www.ruanyifeng.com/blog/2011/08/a_detailed_explanation_of_jquery_deferred_object.html 原文作者 ...