學習和使用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 效果不一樣。
繼續搜索,找到:
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 來實現的。