ImageMagick - 設置透明帶 AlphaChannel 的 png 圖片的透明度


學習和使用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 來實現的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM