2015-09-30 62 views
5

我们试图在将一系列图像合并为一个图像之前应用一个覆盖图。现在看来imagemagick将图像转换为应用的颜色,而不是应用叠加。文件不太清楚我们应该采取什么不同的做法。如果您对此有所了解,我将不胜感激。代码如下:在Rails中使用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 

回答

0

我不进的回报率,但我相信你与纯色替换,而不是覆盖你的形象你的形象,因为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

+1

这并不工作,但哥们谢谢我试了一下。这只是imagemagick有这样冒泡的文档... soooo写很多... –

3

我不说话红宝石,但我怀疑你有错误的混合模式。在命令行中,你可以看到可用的混合模式:

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

现在,这可能会,也可能不是你想要的,所以我可以运行所有的avai拉布勒混合模式是这样的:

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

+0

好的回答@MarkSetchell。一旦混合被识别出来,如果定义了它,使用正确的方法转化为Ruby更容易,或者由于该特定方法知道需要适应什么。 – Giuseppe