Hoodlum1980 (fafa)'s Technological Blog

Languages mainly using and digging: C / CPP, ASM, C#, Python. Other languages:Java.

博客园 首页 新随笔 联系 订阅 管理

【简介】

Photoshop ICO 插件是为 Photoshop 开发的功能扩展插件(支持 64 位 Photoshop),使得 Photoshop 可以直接读写 ICO 格式文件。由于 Photoshop 具有强大的像素位图编辑功能,用户众多,用户基础好,这使得使用 Photoshop 制作图标变得方便,简单,快捷。而基本上降低了对多个软件协同合作的需求。也就是说,可以使用 Photoshop 就能完成绝大多数的工作,剩下一点小小的工作,例如图标文件的合并等,就属于比较简单的任务,相应的软件也比较容易开发和提供。

经过一段时间的紧张开发,在 13 年之后(2.0 版本于 2010 年发布)我终于可以发布最新版 (V3.0)的 ICO 文件格式插件了。这一次的更新我做了非常多的功能升级,最主要的新增功能特性包括:

(1)新增 X64 版本,提供这个对开发来说几乎 0 成本,但是对用户来说却很重要的一个需求。因为现在的软件和 PC 已经普遍进入 x64 时代了。

(2)新增对包含 PNG 格式图像的图标的支持,这种格式是由 windows vista 开始引入并支持的,PNG 格式图像采用 zlib 压缩,可以大大减小文件尺寸,但是一些比较古老的软件可能不支持。保存图标时,用户可以选择是否使用 PNG 格式来压缩 32 BPP 图像。

(3)新增对鼠标光标文件(cursor)的读写支持,支持设置 hotspot。在 2.0 版本中对光标文件的支持不够完善,在 3.0 版本中光标得到完整支持。

(4)在读写选项对话框上提供更强和更友好的 UI 支持,尤其是在保存图标时,用户可以实时预览到自动生成的其他尺寸和质量的图像。用户可以自由勾选想要包括在文件中的图像。尤其是对 32 BPP 为基础生成其他低质量的图标时,原来 V2.0 版提供的 alpha threshold 参数不能直观预览,使得这个参数的设置十分盲目,现在用户可以通过拖动 slider 滑竿控件,实时看到这个参数对生成图像的影响。

(5)采用质量更佳的我自己写的全像素插值(不是采用 4 像素或 16 像素插值,而是源图像的所有像素都将参与插值计算)的图像缩小算法。可以使得生成的小图像质量比 2.0 版本的 4 像素插值更好。

(6)生成索引图像依然采用 8 叉树算法,使得生成的索引图像具有最合适的颜色表。生成 1 BPP 的二元图像,则使用比较简单的灰度阈值方法,因为八叉树算法不适合于生成 1 BPP 图像。

(7)新增 UI 多语言支持。插件已经内置中文和英文语言资源,点击对话框上的国旗图标,在弹出的上下文菜单上可以切换界面语言。用户也可以通过语言资源模板文件,很容易为插件添加第三方语言支持。或者如果用户对内置语言有不满意之处,可以通过增加语言资源的 xml 文件,实现“覆盖”插件的内置语言资源,因为外置的语言资源文件,比插件内置的语言资源优先级更高。实现多语言,增加了很多开发精力。尽管对国人来说这一功能意义不大,但这是我非常看重的一个功能点,所以我尽最大努力将它实现了。

(8)新增对插入 BPP16 的 R5-G6-B5 格式图像的支持。V2.0 版本的插件已经支持 BPP16 图像的读取,尽管这种格式的图像在现实中应该是非常罕见,一些图像读取软件可能也不支持这种格式,但这种格式的图像还是有存在的,主要是在特殊的设备(例如比较古老的手机)或者历史时期为了降低图像文件大小的考虑。所以插件同时支持插入 BPP16 的 R5-G5-B5 (555)和 R5-G6-B5 (565)两种 BPP 16 的支持。但仅在读取或者用户选择要插入新的图像时,可以选择。保存时,插件默认不会插入 BPP16 的图像。

 

【下载链接】下面是新版 ICO 插件 V3.0 的下载链接:ICO v3.0.9.zip

 

版本 发布日期 文件名 md5
v3.0.9 2023-10-28 ICO.8BI 26026f025b6aed7d18dd730d279cc05b
ICO64.8BI 3551b9467070e9ef29acb68713f30f1c
PsPlugInSetup.exe fb38d8b5f8e206f99ef9b8137412593e
ICO-V3.0.9.zip e1e605628cf8f9216d861b88b14dc47a

 

检查文件 MD5 以确保这些文件是源自作者发布的版本且未收到他人改动。

其中 x86 (32 位)版本是我主要调试的版本,使用 Photoshop CS (8.0.1)调试和测试。x64 版本简单经过 Photoshop CS4(11.0)(64 bit )以及 Adobe Photoshop 2023 (v24.7.1)(64 位)的测试。

 

【功能简介】

(1)从 PE 文件中抽取图标或光标文件。

这是从 ICO 2.0 时就有的功能,也是我开发的这个插件区别于其他人开发的插件的一个特色功能。就是它可以直接从 PE 文件中抽取图标,而不需要借助第三方软件,这使得获取和编辑其他 PE 文件中的图标或光标,变得很简单容易。

打开一个含有图标,光标文件的 PE 文件,注意,如果文件是 EXE 后缀,需要先把文件后缀改为 DLL,才能打开,这点和 V2.0 时的要求一样 (因为直接打开 EXE 后缀的文件时,Photoshop 将不会被调用文件格式插件)。例如,打开 shell32.dll 时,将弹出图标资源列表。如果同时有图标和光标资源,则他们被分组显示,其中第一组是图标,第二组是光标,如下图所示:

用户可以选定一个资源,导入到 PS 中进行编辑。但是由于每次只能导入 PS 一个资源,且每个资源只能导入其中的一个图像,这使得保存时,将和 PE 文件中的资源产生差别,或者说有损的另存。为了规避这一点,所以这里也可以选择不经过 PS,而是直接把图标按照 PE 中的原样导出到硬盘文件。用户可以一次选择一个 PE 文件中的所有图标和光标,然后选择一个文件夹,点击“好”,就可以将这个 PE 文件中的所有图标和光标全部原样导出了。

在比较新的 windows 版本中,一些 DLL 的图标等不变资源被分离到了另一个以 mun 为后缀的文件(实质也是 DLL 文件,只是后缀不同)中,并放在 "C:\Windows|SystemResources" 目录下。可能是因为这些 DLL 针对不同语言可以有多个版本,但是这些图标之类的资源是不变的,所以为了避免让这些资源跟随 DLL 形成多份副本,而把这些不变的资源从原  DLL 中剥离到另一个 DLL 中进行”共享“。所以 ICO 插件新增了支持打开 ”mun“ 后缀的文件,如下图所示:

 

(2)当用户选择一个图标文件,或者从 PE 中选取了一个图标导出时,如果这个资源包含多个图像,则会弹出图像选择对话框,要求用户选择要读取的图像:

在这里,用户可以选择图像,可以对图像进行放大和缩小的操作,还可以设置图标的背景,查看图标和不同背景色合成的效果。也可以显示像素网格(只有放大倍数 >= 400% 时才会显示像素网格)。插件将默认先选中图标中质量最佳的图像。如果图标只有一个图像,则这个对话框就不会显示,而是直接将唯一的图像打开到 Photoshop 文档中。打开图标之后,如果图像具有 AND MASK(非 PNG 图像),则 AND MASK 被添加到 Photoshop 的一个新建通道,之前在 V2.0 中,这个通道是和图标中的数据一致,但是会和用户对通道的自觉不符,(AND MASK 中的白色代表透明像素,黑色代表不透明像素),因此为了更符合用户直觉,在 V3.0 中,我反转了这个通道。现在 Alpha 通道对应选区,将成为代表 AND MASK 的通道的选区的子集。

用户选择预览合成效果和 Alpha 通道的信息,当鼠标在图像中移动时,对话框底部将会显示鼠标的位置和像素的 BGRA 信息。

 在这个对话框上,支持使用快捷键  Ctrl   +  Ctrl   -  缩放图像,支持  Ctrl   '  (单引号)切换显示像素网格状态,熟悉 Photoshop 的用户可以知道,这些快捷键和 Photoshop 的快捷键是一致的。

(3)当用户打开一个光标(CURSOR)文件时,这个对话框还将增加一个选项:“突出显示光标热点”,开启时,光标热点将会用一个红色十字表示其所在位置,如下图所示:

 

在打开光标文件时,热点将作为一个独立的通道,被添加到 Photoshop 文档中,用户能够通过通道,查看光标的 hotspot 所在位置。

 

(4)保存图标时,将会弹出保存图标对话框:

 

这个对话框是 3.0 版本插件相对于 V2.0 极其重要的功能增强之一。首先,对话框已经插入了其他的大小和质量的建议图像,用户可以勾选自己需要的图像,并且可以对每个生成图像进行预览。如果这些图像不满足用户需求,也可以点击“插入新图像”按钮,插入其他尺寸和质量的图像(包括 16BPP 的 R5G5B5 或 R5G6B5)。这里最重要的就是,当从一个 32 BPP 的图像,生成其他 BPP 图像时,相当于从反锯齿图像,生成锯齿图像,这里很重要的一个参数就是对透明像素和不透明像素的区分参数:Alpha 阈值。在 32 BPP 图像中,每个像素都具有一个 alpha 信息(在 0 - 255 之间),控制和背景的 alpha 合成。0 代表完全透明,255 代表完全不透明,中间值则是半透明的合成。当降级到 BPP 小于 32 时,这些处于 0 和 255 中间的 alpha 值的像素,就必须选择要么成为透明,要么不透明,这就是 alpha threshold 这个参数的作用。插件的逻辑是,要用户设定一个 alpha threshold:

如果像素的 ALPHA 值 < AlphaThreshold,则将这个像素变为透明像素,否则这个像素不透明。示意代码如下:

 1 // 下面的代码以生成的目标图像为 24 BPP 为例。
 2 if(pSrc[3] < AlphaThresh)
 3 {
 4     //当 Alpha < AlphaThresh 时,使该像素透明。
 5     pAND[col / 8] |= (1 << (7 - (col & 7)));
 6     pXOR[0] = 0; //explicit make XOR black. (won't change bkgnd);
 7     pXOR[1] = 0;
 8     pXOR[2] = 0;
 9 }
10 else
11 {
12     //当 Alpha >= AlphaThresh 时,使该像素不透明。
13     pXOR[0] = pSrc[0];
14     pXOR[1] = pSrc[1];
15     pXOR[2] = pSrc[2];
16 }

 

因此,如果 AlphaThreshold = 0,则图像将完全不透明。如果 AlphaThreshold = 256, 则图像将完全透明。

在对话框上提供了 alpha threshold 的 slider 滑竿,用户可以通过拖动滑竿,实时看到这个参数的改变,对生成图像结果的影响。很多 32 BPP 图像可能带有一个渐隐的阴影,所以它最重要的作用就是控制锯齿图像的这种阴影黑边的大小,我们可以从下图看出 alpha threshold 参数对生成图像的影响:

 

我们可以看到当 AlphaThresh = 1 (默认值)时,生成的图像保留了最多的原图像素,也就使得阴影比较大。当增加 AlphaThresh 时,图像的阴影部分将会逐渐缩小。当拖动调节滑竿时,用户将可以实时看到生成图像的效果,因此可以更好的调节生成图像的质量。而在 v2.0 版本插件中,这个参数不能实时预览,因此只能凭感觉设置,导致生成的图像效果难以控制。

(5)保存光标文件时,用户可以设置光标热点:

 

用户可以选择要保存到的文件类型,当选中“光标”类型时,对话框将会显示“热点”设置的按钮,点击设置热点按钮,就可以通过鼠标在图像上按下来设置热点了(这个操作和在 Visual Studio 中一致),或者直接在文本框中输入对应的数值即可。但这里我没有提供突出显示热点的功能选项,因为这个并不是那么重要。

 

(6)主图像的概念。

在保存时,所有图像中有一个图像,是直接来自于 Photoshop 文档的数据,这个图像就被称之为主图像,或者源图像,所有其他图像都是从这个主图像的数据为基础,而后生成出来的。所以主图像具有很重要的作用,它在 listview 列表中,尺寸后面被加上一个感叹号,备注中也特别标明了“源自 PS 文档”,来表示这是主图像。主图像的主要作用是,对主图像的 alpha threshold 和 hot spot 的设置,将会自动传播到其他“子图像”中(其中 hot spot 在其他图像中采用等比例设置)。因此,当选中主图像时,alpha threshold 和 hotspot 对应的控件都会用粗体字体显示,这表示这时的设置将会自动传播给其他所有图像。当选中非主图像时,这些设置将只会对当前选中的这一个图像有效,其他图像不会受到影响。也就是说,主图像相当于对其他图像的参数起到一个总的控制作用,而每个图像又可以有自己的单独设置。

 

(7)对没有透明信息的图像,保存时,将显示设置透明色的按钮。这里对 V2.0 版本有所不同的是,我对这里的透明设置做了简化,因为 V2.0 版本在这里的设置透明色的选项有些花里胡哨,但是作用并不是很大,因为这个需求本身没那么重要和常用,所以在 V3.0 版本里我对这个功能简化成只提供设置透明色的功能,用户设置一个透明色,来把图像变为部分透明,因为在开发中有一些资源是使用透明色贴图的,所以这里可以比较方便的将其转化为图标。

 

(8)对每个 32 BPP 的图像,用户可以自主选择是否使用 PNG 编码,这里建议是对超过 48 像素尺寸的图像,使用 PNG 编码,以使得图像尺寸较小。但是有些图像软件可能不支持 PNG 编码的图像,所以这里需要用户自行考虑。要修改图像编码设置,只需要双击对应图像的编码列,将会弹出一个 combobox,用户可以切换编码,如果没有选择 PNG 编码,则插件使用非压缩格式的 BI_RGB (Windows 位图格式)方式进行编码。

 

需要注意的是,只有 32 BPP 的图像才能修改编码。非 32 BPP 的图像,只能采用 BMP 存储,这是因为如果把 BPP1 - BPP 24 的图像使用 PNG 编码,将会丢失图标 AND MASK 中携带的透明信息,因此其他 BPP 不支持采用 32 BPP。

 

(9)ICO 3.0 采用的全像素插值缩小算法,和 ICO 2.0 采用的删除像素或四像素插值算法的结果对比,如下图所示:

 

这里的算法是把一个 256 x 256 的 32 BPP 图像,缩小至 48 x 48 像素的 32  BPP 小图像,这里的比对效果可能不是很明显的区分“优劣”,但可以说明一些问题。那就是 ICO 2.0 算法采用的不管是删除像素(COLOR ON COLOR),还是四像素插值的方法,都因为丢失大量中间像素的颜色信息,而产生了一种“锐化”的尖锐感,如果特定图像和特定缩放比例不巧的话,还会丢失掉重要颜色信息,而使得结果不理想。而 ICO 3.0 因为是对原图所有像素都参与插值,所以结果会显得依然比较平滑,视觉效果会更加自然,给人的主观感受会更接近原图。

 

【常见问题】

(1)保存的时候,为什么文件类型中没有出现 ICO 格式?

答:因为 ICO 和 CURSOR 文件的最大尺寸是 256 x 256 像素。因此如果 Photoshop 文档的高度和宽度有任何一项超过 256 像素,则保存的时候,ICO 文件格式就会被 Photoshop 自动隐藏,这是因为插件的 PIPL 属性中指定了文档的最大尺寸为 256 X 256 像素。因此,如果要保存为 ICO 格式,请先把 Photoshop 文档的图像大小缩放到 256 x 256 像素以下,保存的时候就可以选择 ICO 格式了。

 

(2)保存为 ICO 的时候,怎样修改图像编码为 PNG 编码,或者禁止使用 PNG 编码?

答:只有 BPP = 32 的图像,支持使用 PNG 编码保存。对 32 BPP 图像,用鼠标双击保存选项对话框右下角的 ListView 的 ”编码“ 一列,在弹出的组合框中选择编码,”-“代表不使用 PNG 编码,然后鼠标点击其他位置,使组合框失去输入焦点,即完成对该图像编码的设置。可以对每个 32 BPP 的图像进行编码设置。注意,一些古老的软件可能不支持解码含有 PNG 编码图像的 ICO 文件。

 

(3)能不能在保存选项对话框上,直接编辑某个图像某个像素的颜色和 Alpha 值,或者选择一个文件作为插入图像?

答:目前版本(ICO V3.0.2 ) 尚不支持。未来在评估需求和实现比较合理的情况下有可能引入类似功能。

 

(4)如何为插件增加新的语言支持?

答:编辑压缩包内的 "ICO_LANG_TEMPL.xml",把文件中的 elements 的 Text 翻译到对应语言,然后把这个文件更名到 "ICO.LANG.<your-language>.xml' ,并复制到插件被安装到的目录,这时,如果文件内容能够正确加载,在对话框上点击图标将能看到相应的菜单项被添加,这时就可以使用这种语言资源了。其中,语言 ID 也就是国旗 ID,可以查阅压缩包内的 FLAGS_00_3F.png 等文件得到,插件已经内置了这 200 多个国家或地区的旗帜图标。

(5)如何手动安装插件?

答:以 x86 为例,x64 于此类似:把 ICO.8BI (32 位版本)文件复制到Photoshop的文件格式插件目(例如 C:\Program Files\Adobe\Photoshop CS\增效工具\文件格式 )文件夹下面,重新启动Photoshop即可。在PS的菜单中如果有下面的菜单:帮助-关于增效工具-ICO...,则说明插件安装成功。

 

(6)如何卸载 ICO 插件:
答:从插件安装目录中删除 ICO.8BI 或 ICO64.8BI。然后打开注册表编辑器,删除以下注册表键(如果存在),这些注册表键用于存储用户选择的界面语言信息(根据 Photoshop 启动时是否具有管理员权限,以及 Photoshop 是 32 位还是 64 位而有以下多个可能):


    "HKEY_USERS\<your user id>\SOFTWARE\Classes\VirtualStore\MACHINE\SOFTWARE\Wow6432Node\Adobe\Photoshop\hoodlum1980\ICO"
    "HKEY_USERS\<your user id>\SOFTWARE\Classes\VirtualStore\MACHINE\SOFTWARE\Adobe\Photoshop\hoodlum1980\ICO"
    "HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Adobe\Photoshop\hoodlum1980\ICO"
    "HKEY_LOCAL_MACHINE\SOFTWARE\Adobe\Photoshop\hoodlum1980\ICO"

 

(7)为何 Photoshop 记不住我在插件上选择的语言?

答:这种情况可能出现在运行在 64 位操作系统的 64 位版本的 photoshop 上,例如当用户没有使用管理员权限启动 Photoshop 时。请使用管理员权限启动 Photoshop。或者使用注册表编辑器编辑以下位置的键值:

Key Path: "HKEY_LOCAL_MACHINE\SOFTWARE\Adobe\Photoshop\hoodlum1980\ICO"

LangID = REG_SZ: "cn"    //语言 ID(大小写不敏感)

StrCase = REG_DWORD: 0    //只有 LangID = "us" 时有意义,0-None, 1-LowerCase, 2-UpperCase, 3-TitleCase。

 

【参考资料】

(1)A Simple Method for Color Quantization: Octree Quantization. (生成索引图像的八叉树算法)

(2)flag icons (by mjames@gmail.com). (所有国家或地区国旗图标)

 

【版本更新历史】

(1)v3.0.3: 选择图像对话框:去除 “显示图像边框” checkbox,因为这个选项的存在意义不大。增加 [Ctrl]-['] 快捷键,用来切换显示像素网格状态。2023-10-19。

(2)v3.0.4:对 32 BPP 图像,显式将透明像素的 XOR mask 部分设置为黑色。2023-10-23。

(3)v3.0.5:修复 BUG:当 photoshop 的文档的宽高比过大(或过小)时,生成的小图片因为短边被设置为 0 而导致 Photoshop 崩溃。2023-10-24。

(4)v3.0.6:增加对 Photoshop “位图”模式文档的支持,但这种模式不支持透明。但是我不知道为什么我已经在插件资源中已经明确声明不支持的那些模式,在保存的时候,ICO 格式依然可选。2023-10-24。

(5)v3.0.7: 增加对 CMYK 和 Lab 图像模式的支持,增加对 16 位和 32 位通道的支持。2023-10-27.

  下表是 ICO 插件对不同图像模式的支持性 (从 v3.0.7 起),保存时,16 位和 32 位通道将被插件转换为 8 位通道,CMYK 和 Lab 模式的图像将被插件转换为 RGB 颜色空间:

 
图像模式
通道位深度
通道 是否支持透明
ICO 插件是否支持
位图 1 I  
灰度 8, 16, 32 g [A]
索引颜色 8 I ✅(有锯齿)
RGB 颜色 8, 16, 32 RGB [A]
CMYK 颜色 8, 16 CMYK [A]
多通道 8, 16      
双色调 8, 16      
Lab 颜色 8, 16 Lab [A]

 

备注:“I” 通道指该通道含有颜色索引数据。“g” (小写的 “G”)通道指该通道含有灰度数据。“A”通道指该通道包含像素 alpha 值即每个像素的透明度信息(该通道在 photoshop 的通道面板上不可见)。方括号 “[ ]” 表示该通道是可选的,可能会不存在。索引颜色模式通过透明色索引支持透明,所以它和背景合成时是有锯齿的(一个像素要么完全不可见,要么完全不透明)。

 

(6)v3.0.8: 修复 BUG:当保存灰度模式图片时,主图像(源自 PS 文档)是一个 8 BPP 有锯齿图像(为了节约文件大小),尽管 PS 文档可能含有 alpha 信息,这种情况下,保存选项对话框上的 AlphaThresh 调节无法应用到主图像上,这个问题在该版本中被修复。特别的,在这种情况下,插入一个和 PS 文档尺寸相同的 32 BPP 图像应当被允许,这种特殊情况下的图像质量升级是有意义的,这意味着用户可以插入一个 BGRA 图像(从灰度图像生成),文件尺寸将会变大一些(未压缩尺寸将是 8-BPP 图像的大约 4 倍),但可以保持图像质量为反锯齿图像。2023-10-27。

(7)v3.0.9: 修复 BUG:保存选项对话框弹出时,TrackBar 控件没有重绘(指针未指向正确位置)。调整英文术语拼写(将 "Anti-Aliased" 改为 "Anti-Aliasing" )。2023-10-28。

posted on 2023-10-15 21:56  hoodlum1980  阅读(941)  评论(1编辑  收藏  举报