【问题标题】:Color overlay with opacity using ImageMagick in Rails在 Rails 中使用 ImageMagick 的不透明度颜色叠加
【发布时间】:2015-12-28 16:30:27
【问题描述】:

我们正在尝试在将一系列图像合并为一个图像之前对其应用叠加层。现在似乎 imagemagick 正在将图像转换为应用的颜色,而不是应用覆盖。文档对于我们应该采取哪些不同的做法不是很清楚。如果您对此有任何见解,我将不胜感激。代码如下:

def self.concatenate_images (source, image)
  height = FastImage.size(image.url)[0]
  width = FastImage.size(image.url)[1]

  source = source.first
  source = source.resize_to_fill(height, width).quantize(256, Magick::GRAYColorspace).contrast(true)

  User.color_variant.each_slice(3).with_index do |slice,variant_index|

  slice.each_with_index do |color,color_index|                
    colored = Magick::Image.new(height, width) { self.background_color = color.keys[0]}
    colored.composite!(source.negate, 0, 0, Magick::CopyOpacityCompositeOp)

    colored.write("#{User.get_img_path}#{color.values[0]}.png")

    if variant_index == 2 && color_index == 0
      system "convert #{User.get_img_path}#{slice[0].values[0]}.png #{image.url} +append #{User.get_img_path}#{slice[0].values[0]}.png"
    end

    if color_index!=0 && variant_index != 3
      system "convert #{User.get_img_path}#{slice[0].values[0]}.png #{User.get_img_path}#{slice[color_index].values[0]}.png +append #{User.get_img_path}#{slice[0].values[0]}.png"
    end
  end  
end

【问题讨论】:

    标签: ruby-on-rails image-processing imagemagick


    【解决方案1】:

    我不会说 Ruby,但我怀疑你的混合模式有误。在命令行中,您可以看到可用的混合模式:

    identify -list compose
    

    输出

    Atop
    Blend
    Blur
    Bumpmap
    ChangeMask
    Clear
    ColorBurn
    ColorDodge
    Colorize
    CopyBlack
    CopyBlue
    CopyCyan
    CopyGreen
    Copy
    CopyMagenta
    CopyOpacity
    CopyRed
    CopyYellow
    Darken
    DarkenIntensity
    DivideDst
    DivideSrc
    Dst
    Difference
    Displace
    Dissolve
    Distort
    DstAtop
    DstIn
    DstOut
    DstOver
    Exclusion
    HardLight
    HardMix
    Hue
    In
    Lighten
    LightenIntensity
    LinearBurn
    LinearDodge
    LinearLight
    Luminize
    Mathematics
    MinusDst
    MinusSrc
    Modulate
    ModulusAdd
    ModulusSubtract
    Multiply
    None
    Out
    Overlay
    Over
    PegtopLight
    PinLight
    Plus
    Replace
    Saturate
    Screen
    SoftLight
    Src
    SrcAtop
    SrcIn
    SrcOut
    SrcOver
    VividLight
    Xor
    

    如果您查看定义了Magick::CopyOpacityCompositeOp 的文件,我希望您会看到类似的内容。所以,如果我拿憨豆先生和一个相同大小的洋红色矩形:

    我可以运行这样的命令:

    convert MrBean.jpg overlay.png -compose blend -composite output.jpg
    

    我会得到这个:

    现在,这可能是,也可能不是您想要的,所以我可以像这样运行所有可用的混合模式:

    for blend in $(identify -list compose|grep -v Blur ); do 
      convert -label "$blend" MrBean2.jpg overlay.png -compose $blend -composite miff:-
    done | montage - -tile 5x result.png
    

    这给出了显示各种结果:

    【讨论】:

    • 很好的答案@MarkSetchell。一旦确定了混合,如果定义了正确的方法,或者知道由于该特定方法需要调整什么,就更容易将其转换为 Ruby。
    【解决方案2】:

    我不喜欢 RoR,但我相信你正在用纯色替换你的图像,而不是覆盖你的图像,因为 Copy_Opacity 复合方法替换了 alpha 通道 (Copy_Opacity method)。

    代替:

    colored = Magick::Image.new(height, width) { self.background_color = color.keys[0]}
    colored.composite!(source.negate, 0, 0, Magick::CopyOpacityCompositeOp)
    

    试试这个:

    colored = Magick::Image.new(height, width) { self.background_color = color.keys[0]}
    your_overlayed_image.composite!(colored, 0, 0, Magick::ColorizeCompositeOp)
    

    Alpha Compositing (RMagick) - The colorize composite operation

    【讨论】:

    • 这不起作用,伙计,但谢谢你我试过了。只是 imagemagick 有如此冒泡的文档……写得太多了……
    猜你喜欢
    • 2014-07-01
    • 2014-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-24
    • 2018-08-24
    • 2020-06-19
    • 2017-10-24
    相关资源
    最近更新 更多