zoukankan      html  css  js  c++  java
  • ImageMagick

    学习和使用ImageMagick也有几年时间了,其实对 ImageMagick 的了解还仅仅是皮毛吧。

    最近在写代码的时候,遇到一个调整透明png图片透明度的问题:

    当1张png图片,有些区域是透明的,我平时调整图片透明度使用的是:MagickSetImageOpacity(),可对透明背景的png,怎么调也没效果。

    后来实在没办法,我找了两个替换方案:

    方案1. 删除alpha通道: MagickSetImageAlphaChannel(mw_current, RemoveAlphaChannel); 然后再 MagickSetImageOpacity()

    方案2. 给当前的png透明图片加一个白色背景,然后再 MagickSetImageOpacity()

    可是很明显,这两个方案处理结果就是,虽然png透明度能调整了,但是生成的图片背景不透明了。

    我今天用ps尝试了一下,可以正常的调整一个透明的png图片的透明度。

    我想,ps能做到, imagemagick也能办到,继续网上搜索,终于找到一个函数: MagickEvaluateImage(mw_current, MultiplyEvaluateOperator, opacity);

    根据网上的提示,在处理 png 透明图片的透明度时,必须使用 MagickEvaluateImage,用 MagickSetImageOpacity 没用!

    不过,MagickEvaluateImage 第2个参数有很多选择,我花了几分钟时间才找到合适的参数:MultiplyEvaluateOperator,这个就是用来调整透明度的。

     但是测试的时候发现 MagickEvaluateImage(mw_current, MultiplyEvaluateOperator, opacity); 效果不理想,和 ps 效果不一样。

    继续搜索,找到: 

    https://stackoverflow.com/questions/3538851/php-imagick-setimageopacity-destroys-transparency-and-does-nothing?noredirect=1&lq=1

    http://cn.voidcc.com/question/p-emgijyjz-z.html

    使用:

    MagickEvaluateImageChannel(mw_current, AlphaChannel, MultiplyEvaluateOperator, opacity);

    测试发现,这个效果是我想要的。

    到此为止,终于找到答案。

    另注:

    MagickSetImageOpacity() 会将原本透明的背景也设置成半透明状,这个只适合背景不透明的图片处理。

    另外,ImageMagick官网有一个例子:

    将两张图片融合在一起: https://www.imagemagick.org/Usage/compose/#dissolve

    但是这个用的是命令,并不知他具体是使用什么 API 来实现的。

  • 相关阅读:
    小米面试之股票收益最大
    第三周:同时管理64位和32位版本的Python,并用Pyinstaller打包成exe
    第三周 anaconda的安装
    第二周:python实现线性回归(哑变量回归)的高效方法
    第一周:在python里调用C文件中函数
    13G:神奇的数列
    13F:图像分割
    13E:吃奶酪
    13D:拖延症
    13B:回文子串
  • 原文地址:https://www.cnblogs.com/personnel/p/7289311.html
Copyright © 2011-2022 走看看