最近将一个项目中使用的 ImageMagick 由几年前的 6.8.9 升级到了今天的 6.9.11,然后重新编译代码倒没遇到任何问题。但在测试的时候就发现问题了,这是我意料之中的事情。
回想几年前就是因为升级 ImageMagick 的版本,导致一个项目无法正常运行,这才一直停留在 6.8.9 这个版本上。
可这次由于项目中需要处理 heic 格式的图片,而 6.8.9 版本还没有支持 heic,不得已只好升级到目前的 6.9.11
可是:升级有风除,操作要谨慎。
目前发现因升级到6.9.11后出现的问题如下:
1. 文字水印的背景填充色
6.8.9 版本中使用 DrawRoundRectangle() 就可以搞定,不论背景是直角矩形,还是圆角矩形。
在使用 6.9.11 后,发现 DrawRoundRectangle() 如果最后两个参数(角度值) 设置为0,也就是【直角矩形】,背景填充色就不会显示。
一开始我以为这个好办,只需判断如果是【直角矩形】,就使用 DrawRectangle() 绘制背景填充色就行了,可测试发现一个奇葩现象,当背景矩形边框的值比较大时(4, 6, 8),绘制的矩形左侧边框上会出现一个颜色特别的像素点,估计是个bug.
为此,花了我一个多小时才解决这个问题。
2. 当调用 MagickCropImage() 裁剪 png 或 gif 图片时,6.8.9 版没有任何问题。
但在 6.9.11 版本中,当我打算裁剪一个 100 x 100 的尺寸,但最终裁剪出来的是一个 1x1 的尺寸。 相关的资料有:http://blog.sina.com.cn/s/blog_41194bbe0100ep5o.html
解决方案:在调用 MagickCropImage() 前,必须先调用 MagickSetImagePage() 重置虚拟画布。
3. bmp格式的图片
v6.8.9 的 MagickGetImageFormat() 返回 "BMP", 有些特殊的 bmp图片(15-16封底平面图....bmp), MagickGetImageAlphaChannel() 返回 1
v6.9.11 的 MagickGetImageFormat() 返回 "BMP3", 有些特殊的 bmp图片(15-16封底平面图....bmp), MagickGetImageAlphaChannel() 返回 0
4.生成新的图片时,原 sRGB 色彩空间的图片由于图片本身色彩单一,在保存时有可能会自动变成 GRAY 色彩空间。
MagickSetImageFormat(mw, "PNG"); //设置为 PNG 格式 size_t outLen; BYTE *lpData = MagickGetImageBlob(mw, &outLen); ClearMagickWand(mw); //清空 MagickReadImageBlob(mw, lpData, outLen); //重新初始化 mw
v6.8.9 不存在这个问题。
v6.9.11 会有这个问题。
MagickSetImageProperty(mw, "colorspace:auto-grayscale", "false"); //没效果
MagickSetOption(mw, "colorspace:auto-grayscale", "false"); //没效果
MagickSetImageProperty(mw, "colorspace:auto-grayscale", "off"); //没效果
MagickSetOption(mw, "colorspace:auto-grayscale", "off"); //没效果
5.在 win10 系统,软件第一次加载图片生成缩略图的时候,会有明显的卡顿现象,卡顿持续5秒左右的时间,但以后再次加载图片显示缩略图的时候就不再出现卡顿现象。 win 7 系统上不存在首次加载图片显示缩略图卡顿问题,但是 win7 系统上存在更严重的闪退问题。
什么原因引起的,到现在没搞清楚。
难道是因为我没有设置:
_putenv("MAGICK_CONFIGURE_PATH=."); /** 注意: 处理 dng 格式的图片, 格式转换时需要用到 **/
_putenv("MAGICK_HOME=.");
这种可能性我还没有经过测试,因为测试的代价有点大,暂时先记录下,未来有机会再测试吧。
------------------------------------------------------------------------------------------------------
在处理 dng 文件时,必需 CORE_RL_libraw_.dll 和 IM_MOD_RL_raw_.dll
win 10 64位系统上必需: IM_MOD_RL_xc_.dll 否则软件在添加图片后会闪退,并且不提示任何错误。 系统日志一般会有提示错误: CORE_RL_magick_.dll 内部错误。
------------------------------------------------------------------------------------------------------
根据一篇文章【VS2013写的程序在Win XP下运行的完美解决方案】 https://blog.csdn.net/qq_15029743/article/details/79601608
VS2013写的程序默认情况下在 Win XP 下无法运行 (msvcr120.dll)?
Win XP 最高支持 VS2010 写的程序 (msvcr100.dll)
ImageMagick 6.9.11 不支持 xp? 我现在没办法测试。
------------------------------------------------------------------------------------------------------
软件在 win7 上闪退:
错误应用程序名称: xxx.exe,版本: 10.5.0.0,时间戳: 0x0000322c
错误模块名称: CORE_RL_magick_.dll,版本: 6.9.11.5,时间戳: 0x5e8a370f
异常代码: 0xc0000005
错误偏移量: 0x00064fb8
exceptionCode:0xc0000005, EIP=0x755B4FB8 6.1 (7601) 9-14857-x-x
exceptionCode:0xc0000005, EIP=0x0F8D4FB8 6.1 (7601) 0-15363-x-x
exceptionCode:0xc0000005, EIP=0x580E4FB8 6.1 (7601) 9-14857-x-x
从目前这个看, win7 不论32位还是64位,都可能存在同样的问题。
分析:
ImageMagick 自带的 Microsoft c Runtime Library 共有 3 个文件:
msvcp120.dll
msvcr120.dll
vcomp120.dll
其中使用的版本:Microsoft Visual Studio 2013 - Microsoft c Runtime Library - v 12.00.21005.1
方案:
Visual C++ Redistributable Packages for Visual Studio 2013
https://support.microsoft.com/zh-cn/help/2977003/the-latest-supported-visual-c-downloads
我尝试更新了一下:msvcr120.dll - Microsoft Visual Studio 2013 - Microsoft c Runtime Library - v 12.00.40664.0
又添加了两个文件,但这两个文件是否有意义,我不清楚:
vccorlib120.dll - Microsoft VC WinRT core library
vcamp120.dll - Microsoft C++ AMP Runtime
根据两天时间的情况判断,这一切都是徒劳,依然在部分 win 7 (32, 64位) 机器上崩溃。
------------------------------------------------------------------------------------------------------
下面是本次升级的另一个收获:
如果 convert.exe 可以做到, 可通过下面的命令行,得到执行的过程:
-debug events 说明:https://www.imagemagick.org/script/command-line-options.php#debug
-log string 说明:https://www.imagemagick.org/script/command-line-options.php#log
convert -debug "All" -log "%m,%f,%e,%d" test.dng test.jpg
------------------------------------------------------------------------------------------------------
目前就发现这几处,先记录下来。