[更新预告] 我正在开发 ICO 插件的 3.0 版本。增加了新的比原来更好的缩放算法。同时将改进一些 UI。预计 2017 年 6 ~ 7 月可以发布。2017 年 6 月 11 日。
【声明】此插件下载链接已经修复,免费提供。 -- hoodlum1980,on 2011-3-23。
经过了少许努力,现在我将能够发布给 Photoshop 使用的 ICO 文件格式插件 2.0 版。
该插件 2.0 版本主要新增功能是,支持从 PE 文件(DLL,OCX)导入图标的功能。但是由于 Photoshop 可能本身有限制,所以不能直接支持打开 EXE 文件,因此如果要导入 EXE 文件的图标,经过我的调试,发现 Photoshop 不会做任何反应(PS不会调用插件的入口函数),因此一个折中办法是,先把 EXE 文件的后缀改为 DLL,即可正常导入图标。当然,实际上我也能够导入 PE 文件中的位图,但是这个功能意义不大,所以我没有必要去做它。由于有了该功能,现在基本可以肯定,这个插件在功能上一定会超越目前已有的(主要是老外开发的)ICO 格式插件。
【该插件的优点描述】
(1)该插件能够保存 Windows XP 系统引入的标准抗锯齿图标(32 bpp)。能根据当前图像,自动插入其他大小和质量的图像。为开发者生成完美的抗锯齿图标,以应用于他们开发的程序产品中,在资源管理器中形成比较专业的效果,不会产生模糊(图标不具有大尺寸图像导致),锯齿感(图标没有 Alpha 通道导致)。商业软件例如腾讯,Adobe Reader 等都采用的是标准抗锯齿图标。这是其他已知的 ICO 插件不能一步做到的(他们一次只能生成含有单一图像的图标,如果要把多个图标合成为一个图标,需要借助其他软件)。
(2)该插件在为抗锯齿图标自动生成索引图像时,采用了八叉树算法。该算法具有简洁优雅(内存成本少,仅需要较少的树节点开销,时间成本为遍历图像时间,即 O(n)的时间复杂度),对图像质量影响低的优点。相比 IconWorkShop 软件的自动生成的索引图像,由于八叉树算法是根据图像统计信息生成的实际调色板,能尽可能准确的反应具体图像内容,因此在效果上更好(作者主观意见)。
(3)该插件在索引模式下保存为图标时,可以给用户更多设置透明 (AND MASK 数据)的选择,例如根据指定颜色,或者附加通道。
(4)该插件能够从含有图标资源的 PE 文件(DLL,EXE(需要重命名),OCX)中导出图像。这是目前其他已知的 ICO 插件没有实现的功能。
(5)能够读取和存储 16 BPP 的图像。
(6)能够读写光标( CUR )文件,目前其他已知的 ICO 插件不支持。
(7)良好的用户交互性,例如在导入图标,打开图标文件时,为用户显示准确的图标预览图。
(8)代码的准确性,可靠性,稳定性,可维护性,以及代码效率和技巧性,遵守 Adobe Photoshop SDK 文档中的建议和规范(这一点对于用户来说是透明的,不可见的,它取决于作者的态度,自我要求,责任心和技术素质)。
【该插件的目前局限】
(1)当打开一个 16 色图像(4 BPP )时,如果应用透明,那么我将把 Photoshop 颜色表的第 17 个颜色设置为透明色。这是因为,图标图像上的透明部分的 XOR AND 数据一定是黑色的(否则绘制图标时会显示不正常,例如透明部分的背景颜色被改变),而不透明部分可能也有黑色的像素,因此如果把黑色设置为透明色,则可能导致本来不透明的黑色像素在 PS 中也为透明。为了解决这个矛盾,我把透明色设置到第 17 个颜色,这样会保证应用透明时一定时准确的。但是缺点是存储时,由于颜色表数量超过 16,所以会被保存为 256 色图像,即勾选应用透明选项时,4 BPP 图像会被升级成 8 BPP(图像质量没有变化,但文件大小大约增加一倍),即 4 BPP 图像的读写过程不是完全可逆。
(2)打开一个 256 色图像(8 BPP)时,不一定能保证一定能够应用透明,这是因为图标的透明部分本质上是从 AND MASK 数据指定的,每个图标图像相当于一个普通图像携带一个单色图像的蒙版,本质上是两个图像。而索引图像在 PS 中必须从颜色表的 256 个颜色中挑选一个作为透明色(换句话说,透明色不可能出现在图像的显示部分),由于这个矛盾,使理论上一个图标的不透明部分有可能把所有的 256 个颜色都用到,这样就无法对它应用透明,但这种概率是很低的,但我们可以使用编码的手段生成这种图标。对于 8 BPP 图像,在应用透明时,我的方式是遍历图像后,看看颜色表中是否存在没有用到的颜色,把第一个图像上没有使用的颜色作为透明色,大多数情况下这种方法的效果都很好。打开索引图像后,你可以在 Photoshop 的以下菜单查看到对应该图像的颜色表,以及用这种方法找到的透明色,菜单位置:图像 ---- 模式 ---- 颜色表。
(3)因为八叉树算法不适合用于把图像降级成单色图像(二元位图),所以目前暂不支持存储为 1 BPP 图像(但插件能读取 1 BPP 的图像)。
(4)当保存为 32 BPP 多个图像的反锯齿图标时,因为其他图像(尺寸更小,质量更低)是插件以当前图像为基准而自动生成的,所以你只能精确的编辑当前图像(即 PS 的当前文档),用户无法对其他自动生成的图像进行像素级别的编辑。在插件中我已经尝试用最符合用户预期的方式去生成其他图像,但这不可能保证自动生成的图像完全合乎意愿。因此如果你需要继续编辑其他图像,你可以用此插件保存的成果在其他第三方编辑工具中打开进行进一步的细微调整。
从 DLL 导入图标的效果截图如下,以下是从 Windows 系统的 DLL 导入图标是,先弹出的选择图标对话框:
最上方的文本框指示的是PE文件的路径,左侧下拉框可以切换下方 ListView 的视图(平铺,图标,小图标,列表,详细信息),默认为“图标”视图,类似在资源管理器中一样。右侧文本框显示的是当前选中的图标的具体信息,其中的尺寸,BPP 都是图标图像中的最大数据。用户可以拖动该对话框的边缘,改变对话框的大小。插件将会记住用户对话框的视图和大小的设置。用户可以直接双击某一个图标进行打开。如果该图标含有多个图像,将会再次弹出一个对话框,要求用户选择该图标中的具体某一个图像(截图可以参见我的上一篇文章)。
此外,我写了一个PS插件安装工具 (PsPlugInSetup.EXE),可以帮助用户自动安装插件,该安装工具的截图如下:
如图所示,上面的下拉框显示的是 Photoshop 的插件目录,该值是通过查询注册表得到的。下方给出了建议的子目录。上面的两个目录用户也可以自行设置。点击安装即可。
这个工具是一个通用的 PS 插件安装工具,即只需要改变 PsPlugInSetup.ini 中的配置信息即可用于不同插件的安装,由于 PS 中文版的汉化可能并没有汉化注册表里的信息,所以在 ini 文件中需要提供两个建议子目录(分别对应中文版和英文版)。该工具我可以提供源码。
此外,对于插件目录的文本框,采用 SHAutoComplete 实现自动完成功能。值得一提的是,这个安装工具的图标就是使用这个插件从 PNG 素材制作出来的,它是标准的反锯齿图标,含有从 48*48(用于缩略图) 到 16*16(用于详细信息和小图标视图)的多个大小和质量的图像,因此不管在资源管理器的哪种视图下,程序图标都会有很好的显示效果,如下图所示:
最后是该插件的发行包的下载连接(包含 2.0 版本 ICO 插件和安装工具,另附送一个油画滤镜):
(请使用最新版下载链接,原 Release 时 ICO 插件我不记得是否把编译选项设置正确了,如果C++语言选项错误,将导致插件会依赖 VS2005 的运行时库。)
http://files.cnblogs.com/hoodlum1980/PsPlugIns_V2013.zip
这里,在提供一个老外开发的 ICO 插件的简体中文页面(这个页面是我帮他翻译的,因此他给了我 10 美元的报酬):
http://telegraphics.com.au/sw/icoformat.zh.html
要了解抗锯齿图标更多信息,建议安装了 MSDN 的用户阅读以下两篇文章:
(1)《Creating Windows XP Icons》:本文介绍如何创建 Windows XP 图标。
ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.WIN32COM.v10.en/dnwxp/html/winxpicons.htm#winxpicons_step5
(2)《Using Windows XP Visual Styles》:本文主要介绍如何给应用程序,第三方插件等应用 Windows XP 视觉样式,里面提到了如何使用 32 BPP 反锯齿图标。
ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.WIN32COM.v10.en/shellcc/platform/commctls/userex/cookbook.htm#no_extensions
【参考资料】
(1)从PE文件导入图标的实现,主要参考 ICONPRO 源码。该范例位于 MSDN 以下地址:
Win32 和 COM 开发 \ User Interface \ User Interface Design & Usability \ Technical Articals \
ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.WIN32COM.v10.en/dnwui/html/msdn_icons.htm
(2)用于降级图像质量的八叉树算法(保存为多个图像的反锯齿图标时,该算法用于生成 16 色和 256 色索引图像)。
(3)安装工具中自动完成部分,主要参考《Visual C++界面编程技术》,和 codeproject 上某篇文章(具体地址已记不得了),该文章指出,在调用 SHAutoComplete 之前,必须调用 CoInitialize 函数。
【BUG 修正】
(1)H:在导入DLL图标时,修复有可能引发资源泄露的代码。2010-12-29。
(2)H:修复在索引模式存储文件时,可能引发的错误(用于存储文件的某个参数没有正确初始化)。2010-12-29。
(3)L: 修复在索引模式存储文件时,AndMask 设置对话框的界面没有正确初始化的BUG(应该显示的控件没有显示)。2010-12-29。
(4)L: 修复从DLL导入图标时,在选择要导入的图标对话框的 ListView 上,BPP 和备注栏信息不够准确的BUG(某些 32 BPP 反锯齿图标显示成索引)。2010-12-29。
(5)L: 程序美化。打开 ICO 文件时,选择图像对话框的高度可以根据文件中的最大图像高度自动调整。保存没有透明信息的文档时,给用户的提示信息更加显著。关于对话框上的插件版本信息改为从资源中获取。2010-12-30。
(6)L: 为插件安装工具添加“启动 Photoshop”按钮,识别文件版本,覆盖安装提示等功能。2010-12-30。
(7)H: 修复读取文件时对文档的垂直分辨率忽略设置的 BUG,该 BUG 导致在读取非 72 像素/英寸分辨率的 ICO 文件时,会导致 Photoshop 启用像素长宽比校正,使图像变形。2010-12-31。
(8)M: 新增功能,从DLL导出图标时,可以不经过PS,而是直接转存为图标文件。这是因为导入PS时,只能打开图标图像中的一帧图像,因此不能完全按原样导出图标文件。增加此功能以后,图标可以从DLL中无任何改动的导出到文件。当导出至文件的图标数量较大(大于等于10个)时,则会显示一个进度条对话框向用户反馈进度(启用多线程来实现)。调整了选择图标对话框的界面,增加左上角的导出类型下拉框,增加取消按钮下方的“全选”复选框。调整后的对话框如下图所示。2011-1-27。
(9)H:修复打开或导入图标时,弹出“内存不足”的错误提示对话框。更新后,对该图标图像做“不支持的图像格式”处理,即用户不能选择该图像打开。程序的检测标准是,如果该图像的 BitmapInfoHeader 中指定的宽度 >= 2048 像素,或者高度 >= 4096 像素(备注:2048 * 2048 像素,32bpp 的图像需要的内存大约为 17MB ),即认为该图像格式不支持。2011-7-9。
(10)L:把插件中允许的 ICO 文档大小从 512 * 512 像素,提高到 1024 * 1024 像素。该属性主要影响是,如果文档超出该尺寸,存储为的文件格式下拉框中将不会出现 ICO 格式选项。2011-7-9。
(11)M:在从DLL导入图标时,修复由于 CreateIconFromResource 函数使用共享方式创建图标导致的 GDI 对象无法释放问题。该问题在每次使用从 DLL 文件导入图标功能时,会使 PS 进程中的 GDI 对象数量上升(因为共享方式的图标不会被系统释放),当数量达到或接近 10000 时,将会使系统无法正常绘制。2011-8-12。
(12)M:扩充了图标的标准尺寸,从 { 16, 32, 48 } (像素)扩充到 { 16,32,48,128,256,512 }(像素)。也就是说,制作超大图标时,图标文件中所包含的的图像会更多,当然文件尺寸也会更大。版本号升级到 2.0.6。ON 2013-7-9。
(13)L:优化 UI,对于选择图像对话框(打开具有多个图像的图标文件时出现),所有图像中的最大尺寸自动调整对话框和控件的布局。2013-7-9。