2014-06-06 5 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 

내 문제는 그것이 작동하는 것 같다,하지만 난 얻을 수 있기 때문에, 복합 모드 또는 알파 복합 또는 불투명도를 설정하거나 알파가 실패한다는 것입니다 이미지의 검은 색 투명도. 예를 들어 내 워터 마크가 텍스트가있는 완전히 투명한 이미지 인 경우, 차 이미지 위에 올려 놓은 다음 워터 마크가있는 어두운 또는 야간 이미지를 얻으므로 워터 마크의 배경이 제대로 혼합되지 않습니다.

워터 마크 이미지의 불투명도를 올바르게 설정하려면 어떤 제안을 원하십니까? 어쩌면 워터 마크를 푸는 방법이 있을까요?

편집 : 추가 이미지 예 :

http://uppix.com/f-watermarkg53925b100016ab8e.png (워터 마크) http://oi62.tinypic.com/2us8rxl.jpg (기본 이미지) http://oi60.tinypic.com/2pt6mg3.jpg (구성) 닐 슬레이터에

+0

은 그것이 입력과 예 (별도의 이미지, 워터 마크) 및 결과를 보여주기 위해 도움이 될 수 있습니다 이미지 조작이다. 그러면 대답은 그것을 다르게 한 결과를 보여줄 수 있습니다. IIRC는 불투명도와 선재 알파 채널이 원하지 않는 방식으로 결합되기 때문에 기본적으로 다시 계산 된 알파 채널을 가진 새로운 워터 마크를 만들고이를 불투명도 설정없이 합성해야합니다. –

+0

입력 이미지로 업데이트되었습니다. 워터 마크에서 알파 채널을 어떻게 다시 계산합니까? – shakaran

+0

원하는 불투명도 (MultiplyCompositeOp를 사용하여 합성 됨)를 가진 일반 흰색 캔버스로 합성 된 새로운 임시 워터 마크 이미지를 만듭니다. 이 새 이미지에는 기존 알파와 원하는 불투명도의 결합 된 효과가 있습니다. –

답변

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