zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    index of rmvb mp3 rm突破站点入口下载
    人类智商一般在多少左右?爱因斯坦的智商是多少?
    UVALive 5102 Fermat Point in Quadrangle 极角排序+找距离二维坐标4个点近期的点
    ProgressDialog使用总结
    Js中的多条件排序,多列排序
    腾讯2014年实习生招聘笔试面试经历
    周根项《一分钟速算》全集播放&下载地址
    中国大推力矢量发动机WS15 跨入 世界先进水平!
    探索Android中的Parcel机制(上)
    ORACLE uuid自己主动生成主键
  • 原文地址:https://www.cnblogs.com/personnel/p/4585064.html
Copyright © 2011-2022 走看看