zoukankan      html  css  js  c++  java
  • ImageMagick 6.8.9 升级到 6.9.11 需要修改的代码, 必需的 dll

    最近将一个项目中使用的 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() 裁剪 pnggif 图片时,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 

    ------------------------------------------------------------------------------------------------------

    目前就发现这几处,先记录下来。

  • 相关阅读:
    重写Django登录认证,实现用户名或者手机均可登录
    Django media文件夹详解
    Django admin使用
    python极验验证部署
    django 分页
    模板语言控制往哪个地址提交时,如果不填,默认往当前地址提交,也可以用request方法获取当前地址提交
    HashMap、Hashtable、LinkedHashMap、TreeMap、ConcurrentHashMap的区别
    ArrayList、LinkedList、Vector、CopyOnWriteArrayList的区别和源码分析
    谈谈线程池的核心参数,描述核心流程、应该怎么正确使用
    深入CAS的底层实现机制,以及对应的使用风险
  • 原文地址:https://www.cnblogs.com/personnel/p/12654128.html
Copyright © 2011-2022 走看看