用最快速度编写和发布的图标导出工具v1.0版
2007-11-14 04:03
351 查看
=============================================================================================
声明【1】:这篇文章中的代码在写ICO文件时的方法并不够完善和准确。因此保存ICO文件时会有些小问题。目前看来,有两种方法,可能需要把微软的C++的范例源码借鉴并引入到C#项目中,另一种是把该范例改写为一个DLL,然后用PInvoke方式调用。总之,不管采用哪种解决方法,将会改变本文中的技术路线,因为代码修改量比较大,细节也非常繁琐,因此这不是一个短时间内可以完成的任务,暂且放置这样一个声明于此,以提醒借鉴者能注意(这个声明的原因是,一是对自己,本着求是和追求完美的态度,我不能容忍自己的技术日志有缺陷乃至关键性的逻辑错误;二是对他人,本着对潜在读者负责的态度,尽可能不对他人造成误解和负面影响)。我将在时间充裕的时候尽可能快的解决这个问题(有问题的代码暂时放置于此)。
------ hoodlum1980 于 2008年9月26日20:19:02。
============================================================================================
=============================================================================================
声明【2】:时隔两年后,我重新研究了一下ICO文件格式,并修改了代码。因此声明 1 作废。具体细节已补充到原文结尾处。
------ hoodlum1980 于 2010年8月23日
============================================================================================
最近发现我的自动关机程序的图标有点丑陋和粗糙,(是我自己制作的一个qq的老鼠头像),放在桌面上和其他xp图标一比不免相形见绌。于是突发奇想想把自动关机程序的图标换成系统的关机图标,于是我就想导出这个图标。这个图标的位置位于system32目录下的shell32.dll中,vs.net本身就可以直接打开一个模块的资源,但是我发现由于这个dll的图标太多,并且vs.net并没有提供一个方便的预览功能,所以一个个打开查看还是太慢了。于是想起这种图标导出工具很多,但是下载了几个下来一看却让我非常不爽和郁闷。因为这么简单的功能,我下了4~5个竟然没有一个免费版本,都是试用版并且注册要收费的。虽然它们安装以后能用,但是都提示你只能用10次以及经常弹出注册之类的提示,让我感到很生气。所以我干脆自己实现一个简单的。于是决定用开发一个自己用,并且把源码公开。其实很久前就有人给我看过这类工具,但是由于我觉得vs.net就能打开和导出了,再者也有人做了,所以我一直没有关注过,只是看了下相关API函数。
首先是一个应用程序截图:
代码_写入ANDMASK
//写入AND Mask , 1 bpp
stride = (1 * bm.Width + 31) / 32 * 4; //and mask 以DWORD对齐后的扫描行宽度
byte[] line = new byte[stride];
for (int j = bm.Height-1; j >=0; j--)
{
for (int i = 0; i < stride; i++)
line[i] = 0;
//处理当前扫描行
for (int i = 0 ; i < bm.Width; i++)
{
Color color = bm.GetPixel(i, j);
int colorsum = color.R + color.G + color.B;
if (colorsum == 0)
{
//在位图中是黑色说明该像素应该是透明的
line[i/8] |= (byte)(1<< (7 - (i & 0x07))); //i&7: 相当于i%8
}
}
bw.Write(line, 0, stride);
}
修正以上两个问题以后,导出的图标可以在IDE中打开,显示正常,可以正常使用了!
---------------------------------------------------------------------------------------------
最后是项目源代码(build by vs.net 2005 trial)的下载链接:(已经解决声明1中存在的问题)
http://files.cnblogs.com/hoodlum1980/IconExp.rar
声明【1】:这篇文章中的代码在写ICO文件时的方法并不够完善和准确。因此保存ICO文件时会有些小问题。目前看来,有两种方法,可能需要把微软的C++的范例源码借鉴并引入到C#项目中,另一种是把该范例改写为一个DLL,然后用PInvoke方式调用。总之,不管采用哪种解决方法,将会改变本文中的技术路线,因为代码修改量比较大,细节也非常繁琐,因此这不是一个短时间内可以完成的任务,暂且放置这样一个声明于此,以提醒借鉴者能注意(这个声明的原因是,一是对自己,本着求是和追求完美的态度,我不能容忍自己的技术日志有缺陷乃至关键性的逻辑错误;二是对他人,本着对潜在读者负责的态度,尽可能不对他人造成误解和负面影响)。我将在时间充裕的时候尽可能快的解决这个问题(有问题的代码暂时放置于此)。
------ hoodlum1980 于 2008年9月26日20:19:02。
============================================================================================
=============================================================================================
声明【2】:时隔两年后,我重新研究了一下ICO文件格式,并修改了代码。因此声明 1 作废。具体细节已补充到原文结尾处。
------ hoodlum1980 于 2010年8月23日
============================================================================================
最近发现我的自动关机程序的图标有点丑陋和粗糙,(是我自己制作的一个qq的老鼠头像),放在桌面上和其他xp图标一比不免相形见绌。于是突发奇想想把自动关机程序的图标换成系统的关机图标,于是我就想导出这个图标。这个图标的位置位于system32目录下的shell32.dll中,vs.net本身就可以直接打开一个模块的资源,但是我发现由于这个dll的图标太多,并且vs.net并没有提供一个方便的预览功能,所以一个个打开查看还是太慢了。于是想起这种图标导出工具很多,但是下载了几个下来一看却让我非常不爽和郁闷。因为这么简单的功能,我下了4~5个竟然没有一个免费版本,都是试用版并且注册要收费的。虽然它们安装以后能用,但是都提示你只能用10次以及经常弹出注册之类的提示,让我感到很生气。所以我干脆自己实现一个简单的。于是决定用开发一个自己用,并且把源码公开。其实很久前就有人给我看过这类工具,但是由于我觉得vs.net就能打开和导出了,再者也有人做了,所以我一直没有关注过,只是看了下相关API函数。
首先是一个应用程序截图:
代码_写入ANDMASK
//写入AND Mask , 1 bpp
stride = (1 * bm.Width + 31) / 32 * 4; //and mask 以DWORD对齐后的扫描行宽度
byte[] line = new byte[stride];
for (int j = bm.Height-1; j >=0; j--)
{
for (int i = 0; i < stride; i++)
line[i] = 0;
//处理当前扫描行
for (int i = 0 ; i < bm.Width; i++)
{
Color color = bm.GetPixel(i, j);
int colorsum = color.R + color.G + color.B;
if (colorsum == 0)
{
//在位图中是黑色说明该像素应该是透明的
line[i/8] |= (byte)(1<< (7 - (i & 0x07))); //i&7: 相当于i%8
}
}
bw.Write(line, 0, stride);
}
修正以上两个问题以后,导出的图标可以在IDE中打开,显示正常,可以正常使用了!
---------------------------------------------------------------------------------------------
最后是项目源代码(build by vs.net 2005 trial)的下载链接:(已经解决声明1中存在的问题)
http://files.cnblogs.com/hoodlum1980/IconExp.rar
相关文章推荐
- 快捷方便的Excel导入导出工具 Easy-Xls 1.0 版本发布
- 发布一个小工具(XNotePad),可以分页浏览很大的文本文件,速度理想
- CYQ.DBImport 数据库反向工程及批量导数据库工具 V2.0 发布[增加批量导出数据库脚本及数据库设计文档]
- Eclipse导出可运行的jar包,作为工具发布webService接口
- CYQ.DBImport 数据库反向工程及批量导数据库工具 V2.0 发布[增加批量导出数据库脚本及数据库设计文档]
- C# word 编写图标和导出文字以及表格
- 用Python编写博客导出工具
- 发布一款ICO图标和PNG批量转换工具
- 用Python编写博客导出工具
- vs2008Web应用crystal report发布后不能显示工具图标的解决办法
- 发布数据库表结构导出成WORD文档工具 DBExportDoc V1.0 For Oracle
- 微软发布Doloto工具,加快AJAX访问速度
- 用Python编写博客导出工具
- Qt利用QGraphicsScene编写Word排版工具导出PDF
- 正式发布jmyetl-1.0.2:一个表数据导入导出的ETL工具
- CYQ.DBImport 数据库反向工程及批量导数据库工具 V2.0 发布[增加批量导出数据库脚本及数据库设计文档]
- 用Python编写博客导出工具
- CYQ.DBImport 数据库反向工程及批量导数据库工具 V2.0 发布[增加批量导出数据库脚本及数据库设计文档]
- CYQ.DBImport 数据库反向工程及批量导数据库工具 V2.0 发布[增加批量导出数据库脚本及数据库设计文档]
- 发布一个智能密码钥匙内部证书导出工具ExportCert