使用Rails中的ImageMagick进行不透明度的颜色叠加

时间:2015-09-30 18:59:14

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

我们正尝试在将一系列图像合并为一个图像之前对其进行叠加。现在看起来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

2 个答案:

答案 0 :(得分:4)

我不会说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的文件,我希望您能看到类似的内容。所以,如果我把比恩先生和洋红色矩形的大小相同:

enter image description here enter image description here

我可以运行这样的命令:

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

我会得到这个:

enter image description here

现在,这可能是,也可能不是你想要的,所以我可以运行所有可用的混合模式,如下所示:

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

给出了显示各种结果的信息:

enter image description here

答案 1 :(得分:0)

我没有进入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