注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

简单代码

寻找代码的灵魂

 
 
 

日志

 
 
关于我

对于本博客内所有原创文章和代码的引用必须标明“来源:http://simplesource.blog.163.com/”。如需应用于商业目的必须经本人同意,本人对所有原创文章和代码保留一切权利。 PS:需要部分程序源代码的请留下邮箱地址

网易考拉推荐

win7适用!大图标生成工具  

2012-09-17 21:46:19|  分类: 我的程序 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
  以前我一直用一款叫IconCoolStudio的图标工具,但是随着时代的发展这个工具慢慢不适用了。特别是在win7下这个工具生成的图标变得很小很难看。于是自己写了个图标生成工具,这个图标工具可以以PNG图片为基础生成严格与MFC提供的图标结构一致的图标文件。
  先上俩截图:
  win7适用!大图标生成工具 - 简单代码 - 简单代码
   win7适用!大图标生成工具 - 简单代码 - 简单代码
  使用方法:打开程序,然后拖拽PNG图片到程序界面,选择大小和颜色深度,最后保存为ico文件。

程序下载:PngToIcon.rar

图标文件格式
  图标文件(*.ico)由图标文件头、图片入口数据和图片数据三个部分组成,这三个部分的具体结构如下:
1. 图标文件头
  图标文件头包括三个部分6个字节,他们分别是

数据类型

字节

含义

说明

WORD

2

保留字段(wReserved

必须0

WORD

2

文件类型(wType

必须1

WORD

2

图片数量(wCount

表示该图标文件包含多少个图片

2. 图片入口
  接下来是wCount个“图片入口”数据。每个“图片入口”数据结构如下:

数据类型

字节

含义

说明

BYTE

1

图像宽度(bWidth

单位:像素。256px的图片该值为0

BYTE

1

图像高度(bHeight

同上

BYTE

1

颜色数(bClrCount

不重要

BYTE

1

保留字段(bReserved

必须为0

WORD

2

平面数(wPlanes

一般为1

WORD

2

比特数(wBitCount

颜色深度,取值4位、8位、24位和32

DWORD

4

数据大小(dwImageSize

对应图片数据占用的字节数

DWORD

4

数据位置(dwOffset

对应图片数据在文件中的位置

3. 图片数据
  对于256X256像素的图片,在文件中存储的格式是PNG,只要将整个PNG文件写在数据区就可以了,对应前面的图片入口的数据大小(dwImageSize)也是PNG文件的大小。但是XP操作系统不认该图片。
  对于其他图片,该区域存放了一个目标颜色深度(wBitCount)的数据位图后面跟一个对应的遮罩位图。系统在绘制图标时会先将遮罩位图与目标设备“与”拷贝(SRCAND),然后在把数据位图与目标设备“异或”拷贝(SRCINVERT)。
  数据位图的颜色深度可以是4位16色、8位256色、24位真彩色或32位带Alpha通道。需要注意的是就算是32位带Alpha通道的位图也是需要遮罩位图的。
  遮罩位图是一个1位颜色深度的2值位图,有图像的位置填0,透明的位置填1。
  数据位图的结构与普通位图结构基本相似,但是缺少14位的位图文件头。具体包含位图信息头、颜色表(只有4位和8位的位图才会有,4位的位图颜色表长度为16X4=64字节,8位的位图颜色表长度为256X4=1024字节)和数据区。
  位图信息头结构如下:

数据类型

字节

含义

说明

DWORD

4

结构大小(biSize

固定为40

LONG

4

图像宽度(biWidth

单位:像素

LONG

4

图像高度(biHeight

单位:像素。由于还有遮罩因此要X 2

WORD

2

平面数(biPlanes

一般为1

WORD

2

比特数(biBitCount

颜色深度,取值4位、8位、24位和32

DWORD

4

压缩(biCompression

一般为0

DWORD

4

数据大小(biSizeImage

 

LONG

4

分辨率(biXPelsPerMeter

 

LONG

4

分辨率(biYPelsPerMeter

 

DWORD

4

使用颜色(biClrUsed

 

DWORD

4

重要颜色(biClrImportant

 

  获取数据位图可以用如下办法:
  先利用CImage类创建一个目标大小和颜色深度的位图。注意:4位和8位的位图需要设置颜色表,不然无法从源图片复制数据,颜色表可以采用固定的数据。32位位图需要开启Alpha通道,不然无法复制Alpha通道的数据。
  然后利用CImage::GetDC、CImage::ReleaseDC、CImage:: GetPixelAddress和CImage::Draw等函数从源图复制图像数据到该位图。
  接着将该位图保存到一个临时位图文件中。从该文件中读取位图信息头、颜色表和位图数据,并修改位图信息头的图像高度(biHeight)字段为原来的2倍。
  最后将这些数据都写入到图标文件对应的数据区域。
  后边跟着的遮罩位图数据获取方法类似,只不过遮罩位图就不需要复制位图信息头和颜色表了。
  另外附CImage类显示PNG位图的小技巧,我以前用CImage类显示PNG也总是失真,今天(20120917)在网上看到了一个神贴。原来与CImage类的半透明绘图方式有关,CImage类在绘制半透明图时直接用自己的像素分量(红绿蓝值)加上目标设备的像素分量与1-Alpha/255的乘积,这导致很多像素分量超过255,从而使图像失真。可以在绘制前将每个像素的红绿蓝值都乘以Alpha值然后除以255解决。

  评论这张
 
阅读(2363)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018