2014-06-06 130 views
3

我想創建一個具有不透明度值的水印(從0不透明值到1完全透明)。Rmagick設置透明度水印透明度

我有RMagick在紅寶石下面的方法:

# 0 = opaque (Magick::OpaqueOpacity) 1= transparent (Magick::TransparentOpacity) 
    def watermark(opacity = 0.99, size = 'm') 
    manipulate! do |img| 
     logo = Magick::Image.read("#{Rails.root}/app/assets/images/watermark#{size}.png").first 
     logo.alpha(Magick::ActivateAlphaChannel) 
     logo.opacity = (1 - opacity.to_f) * Magick::QuantumRange 
     img.alpha(Magick::ActivateAlphaChannel) 
     img = img.composite(logo, Magick::NorthWestGravity, 0, 0, Magick::OverCompositeOp) 
    end 
    end 

我的問題是,它似乎工作,但複合模式或字母組合或設置不透明度或Alpha失敗,因爲我得到圖像中的黑色透明度。例如,如果我的水印是帶有文本的完全透明的圖像,然後放置在汽車圖像上,則會得到水印更深的或夜間的圖像,因此水印的背景不能正確混合。

任何建議正確設置水印圖像的不透明度?也許一些解決水印的方法?

編輯:添加圖像的例子:

http://uppix.com/f-watermarkg53925b100016ab8e.png(水印) http://oi62.tinypic.com/2us8rxl.jpg(基本圖像) http://oi60.tinypic.com/2pt6mg3.jpg(組合物)

+0

由於這是圖像處理可能會有所幫助,以顯示與輸入的例子(單獨的圖像,水印)和結果。然後答案可以顯示出不同的結果。 IIRC你基本上必須建立一個新的水印與重新計算的阿爾法通道和複合材料*沒有*不透明度設置,因爲不透明度和預先存在的阿爾法通道以不希望的方式組合。 –

+0

更新了輸入圖像。你如何重新計算水印中的alpha通道? – shakaran

+0

您可以創建一個新的臨時水印圖像,該圖像與具有所需不透明度的普通白色帆布合成(使用MultiplyCompositeOp進行合成)。這張新圖片將具有您想要的現有alpha和不透明度數量的綜合效果。 –

回答

4

由於尼爾斯萊特,我終於找到了正確的解決方案。我需要在我finalt結果DstIn +以上的composite operation組合:

def watermark(opacity = 0.99, size = 'm') 
    manipulate! do |img| 
     logo = Magick::Image.read("#{Rails.root}/app/assets/images/watermark#{size}.png").first 
     logo.alpha(Magick::ActivateAlphaChannel) 

     white_canvas = Magick::Image.new(logo.columns, logo.rows) { self.background_color = "none" } 
     white_canvas.alpha(Magick::ActivateAlphaChannel) 
     white_canvas.opacity = Magick::QuantumRange - (Magick::QuantumRange * opacity) 

     # Important: DstIn composite operation (white canvas + watermark) 
     logo_opacity = logo.composite(white_canvas, Magick::NorthWestGravity, 0, 0, Magick::DstInCompositeOp) 
     logo_opacity.alpha(Magick::ActivateAlphaChannel) 

     # Important: Over composite operation (original image + white canvas watermarked) 
     img = img.composite(logo_opacity, Magick::NorthWestGravity, 0, 0, Magick::OverCompositeOp) 
    end 
    end