Nik*_*sos 5 ruby-on-rails imagemagick image-processing
我们尝试在将它们合并为一个图像之前对一系列图像应用叠加.现在看起来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
Run Code Online (Sandbox Code Playgroud)
我不会说 Ruby,但我怀疑您的混合模式有误。在命令行中,您可以看到可用的混合模式:
identify -list compose
Run Code Online (Sandbox Code Playgroud)
输出
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
Run Code Online (Sandbox Code Playgroud)
如果您查看Magick::CopyOpacityCompositeOp定义您的文件,我希望您可以看到类似的内容。因此,如果我将 Bean 先生和一个洋红色矩形的大小相同:
我可以运行这样的命令:
convert MrBean.jpg overlay.png -compose blend -composite output.jpg
Run Code Online (Sandbox Code Playgroud)
我会得到这个:
现在,这可能是,也可能不是您想要的,所以我可以运行所有可用的混合模式,如下所示:
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
Run Code Online (Sandbox Code Playgroud)
这给出了显示各种结果的结果:
我不喜欢 RoR,但我相信您正在用纯色替换图像,而不是覆盖图像,因为 Copy_Opacity 复合方法替换了 alpha 通道(Copy_Opacity 方法)。
代替:
colored = Magick::Image.new(height, width) { self.background_color = color.keys[0]}
colored.composite!(source.negate, 0, 0, Magick::CopyOpacityCompositeOp)
Run Code Online (Sandbox Code Playgroud)
尝试这个:
colored = Magick::Image.new(height, width) { self.background_color = color.keys[0]}
your_overlayed_image.composite!(colored, 0, 0, Magick::ColorizeCompositeOp)
Run Code Online (Sandbox Code Playgroud)
请参阅Alpha 合成 (RMagick) - 着色合成操作