使用Rmagick设置透明度并添加带有透明度的水印

3

我正在尝试创建一个具有不同不透明度值的水印(从0不透明值到1完全透明)。

我有以下用于ruby中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合成或设置不透明度或Alpha失败了,因为图像中出现了黑色透明度。例如,如果我的水印是一个完全透明的图像,并带有一些文本,我将其放在汽车图像上方,那么我会得到一个更加暗淡或夜间的带有水印的图像,所以水印的背景没有正确地混合。
有什么建议可以正确地设置水印图像的不透明度?也许有一些溶解水印的方法?
编辑:添加图像示例: http://uppix.com/f-watermarkg53925b100016ab8e.png(水印) http://oi62.tinypic.com/2us8rxl.jpg(基础图像) http://oi60.tinypic.com/2pt6mg3.jpg(组合)

您的示例图对我来说并不是很有效。特别是水印,因为您使用的站点将其转换为没有 alpha 通道的 JPEG 格式。 - Neil Slater
更新了.png图片。你能提供一些带有代码的例子吗?我正在尝试这个,但没有结果:http://pastebin.com/fJAiyXRP - shakaran
我尝试遵循您的推荐,使用纯白画布和MultiplyCompositeOp,但是我得到了相同的结果,这里是代码http://pastebin.com/Rus3Jy6r,请问我做错了什么? - shakaran
让我们在聊天中继续这个讨论 - shakaran
谢谢Neil!现在它可以工作了,但不是我预期的那样。似乎只有空白颜色的透明度被改变了,而不是黑色。这是现在的结果图像http://uppix.com/f-grande_opacity5392ffa00016ac80.jpg也许我应该改成背景无或背景黑色? - shakaran
显示剩余4条评论
1个回答

6

感谢Neil Slater,我终于找到了正确的解决方案。我需要在最终结果中使用DstIn + Over的组合合成操作

  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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接