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

  • 相关阅读:
    网络流24题
    数据结构(脑洞题,BIT):COGS 2394. 比赛
    字符串(后缀数组||SAM):NOI2015 品酒大会
    数据结构(二维线段树,差分): NOI2012 魔幻棋盘
    HNOI 2016 省队集训日记
    图论(网络流):SCOI 2007 修车
    数据结构(虚树,动态规划):HNOI 2014 世界树
    线性代数(高斯消元):JSOI2008 球形空间产生器sphere
    组合数学(Pólya计数原理):UvaOJ 10601 Cubes
    数学计数原理(Pólya,高精度):SGU 294 He's Circles
  • 原文地址:https://www.cnblogs.com/personnel/p/4585064.html
Copyright © 2011-2022 走看看