• ImageMagick: 6.8.3 升级到 6.8.9 遇到的问题


    最终还是决定升级到目前最新版:6.8.9,不知何时才真正明白为什么现在都是java8,但还是有很多软件系统使用在java5上。

    虽然新版本能带来各种好处,但现实中不能忽略一个问题:原来的代码很可能无法正常的在新版本上使用。

    当我将ImageMagick由6.8.3升级到6.8.9后,一开始测试的时候只发现一个问题,关于生成ico文件时,(色彩空间):

    在6.8.3上,必须指定色彩空间:MagickSetImageColorspace(mw2, RGBColorspace); 

    不然生成的图片偏白。

    但在6.8.9上,使用 MagickSetImageColorspace(mw2, RGBColorspace);  反而偏白,去掉这一句又正常了。

    同时,我发现在 6.8.9 上,返回的图片色彩空间默认是 sRGBColorspace,而我记得在 6.8.3上默认的是 RGBColorspace。

    当时我以为没别的问题了,可是无意见发现一个严重的问题:

    当使用填充图片时:

    DrawInfo *draw_info = PeekDrawingWand(d_wand);

    draw_info->fill_pattern = mw->images; //设置填充图片

    如果 mw_frame(下层图片) 的色彩空间是 GRAYColorspace, 而 mw->images 是 sRGBColorspace, 生成的新图片的色彩空间是 GRAYColorspace,根源是6.8.9版的 MagickGetImageBlob(mw_frame,len) 函数在内部处理上有所变化,MagickGetImageBlob() 函数在处理过程中根据情况会修改 mw_frame 的色彩空间,所以看到的图片变成黑白的。

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

    测试时发现:

    printf("MagickGetImageColorspace(mw_frame):%d ", MagickGetImageColorspace(mw_frame)); //返回 sRGBColorspace

    MagickGetImageBlob(mw_frame,len);

    printf("MagickGetImageColorspace(mw_frame):%d ", MagickGetImageColorspace(mw_frame)); //返回 GRAYColorspace

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

    在6.8.3版,生成的新图片是彩色的,但在6.8.9版上生成的新图片是黑白的。

    用6.8.9版生成新图片前,必须判断当前的色彩空间,如果色彩空间不是 sRGBColorspace, 就设置为 sRGBColorspace

    void useSRGBColorspace(MagickWand *mw)

    {

        if(MagickGetImageColorspace(mw) != sRGBColorspace)

        {

            MagickSetImageColorspace(mw, sRGBColorspace);

        }

    }

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

    关于 MagickSetImageColorspace() 和 MagickTransformImageColorspace()

    我其实没搞明白这两个的区别是什么,不过在过去测试中也得到一个结构:

    如果当前色彩空间是 CMYKColorspace, 想转换成 sRGBColorspace,必须使用 MagickTransformImageColorspace()

    如果当前色彩空间是 GRAYColorspace,想转换成 sRGBColorspace,使用 MagickSetImageColorspace()

    我发现只有 当前色彩空间是 CMYKColorspace时,才必须要使用 MagickTransformImageColorspace()

    将其他色彩空间进行转换,使用 MagickSetImageColorspace()就行了。

    2014-09-19

  • 相关阅读:
    VueCLI3如何更改安装时的包管理器
    查天气43课-46课
    【Python第31课到42课】
    【Python第16课到30课 】
    Python笔记
    【AC】九度OJ题目1153:括号匹配问题
    【AC】九度OJ题目1436:Repair the Wall
    【WA】九度OJ题目1435:迷瘴
    Matlab图片改颜色通道不改名存储
    [Linux 操作] awk操作の 打印图片路径
  • 原文地址:https://www.cnblogs.com/personnel/p/4585064.html
Copyright © 2020-2023  润新知