2014-06-06 2 views
3

J'essaie de créer un filigrane avec différentes valeurs d'opacité (de 0 opaque à 1 totalement transparent).Rmagick paramètre opacité en filigrane avec transparence

je la méthode suivante pour RMagick en rubis:

# 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 

Mon problème est que cela semble fonctionner, mais le mode composite ou composite alpha ou le réglage de l'opacité ou alpha est un échec, parce que je reçois une transparence noire dans l'image. Par exemple, si mon filigrane est une image totalement transparente avec un texte, que je mets une image de voiture, alors je reçois une image plus sombre ou nocturne avec le filigrane, donc l'arrière-plan du filigrane ne se fond pas correctement.

Des suggestions pour définir correctement l'opacité de l'image du filigrane? Peut-être une méthode pour dissoudre le filigrane?

EDIT: Ajout d'exemples d'images:

http://uppix.com/f-watermarkg53925b100016ab8e.png (filigrane) http://oi62.tinypic.com/2us8rxl.jpg (image de base) http://oi60.tinypic.com/2pt6mg3.jpg (composition)

+0

Comme cela est la manipulation d'images, il peut aider à montrer un exemple avec les entrées (image séparée, filigrane) et le résultat. Alors la réponse peut montrer le résultat de le faire différemment. IIRC vous devez essentiellement construire un nouveau filigrane avec un canal alpha recalculé et composite qui * sans * un paramètre d'opacité, car l'opacité et le canal alpha préexistant se combinent de manière non désirée. –

+0

Mise à jour avec les images d'entrée. Comment recalculez-vous le canal alpha dans le filigrane? – shakaran

+0

Vous créez une nouvelle image de filigrane temporaire composée d'un canevas blanc uni ayant l'opacité souhaitée (composée à l'aide de MultiplyCompositeOp). Cette nouvelle image aura l'effet combiné de l'alpha existante et de la quantité d'opacité souhaitée. –

Répondre

4

Merci à Neil Slater, j'ai finalement trouvé la bonne solution. J'ai besoin d'une combinaison de composite operation de DstIn + Au cours de mon résultat finalt:

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