2015-09-30 15 views
5

Wir versuchen, eine Überlagerung auf eine Reihe von Bildern anzuwenden, bevor Sie sie zu einer zusammenfügen. Derzeit scheint es, als ob imagemagick das Bild in die Farbe umwandelt, die angewendet wird, anstatt eine Überlagerung anzuwenden. Die Dokumente sind nicht sehr klar, was wir anders machen sollten. Ich würde mich freuen, wenn Sie dazu einen Einblick haben. Code folgt:Farbüberlagerung mit Deckkraft mit ImageMagick in Rails

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 

Antwort

0

Ich bin nicht in RoR, aber ich glaube, dass Sie Ihr Bild mit der festen Farbe ersetzen, anstatt Ihr Bild überlagert, weil Copy_Opacity Verbund Verfahren den Alphakanal (Copy_Opacity method) ersetzt.

Statt:

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

Try this:

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

Siehe Alpha Compositing (RMagick) - The colorize composite operation

+1

, die nicht Kumpel funktionierte aber danke ich versuchte es. Es ist nur imagemagick hat solche sprudelnde Dokumentation ... soooo viel Schreiben ... –

3

ich Rubin nicht sprechen, aber ich vermute, dass Sie den falschen Mischmodus haben. An der Befehlszeile können Sie die verfügbaren Füllmethoden mit sehen:

identify -list compose 

Ausgabe

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 

Ich erwarte, dass Sie etwas Ähnliches sehen können, wenn Sie in der Datei suchen, wo Ihr Magick::CopyOpacityCompositeOp definiert ist. Also, wenn ich nehme Mr Bean und ein magentafarbenes Rechteck die gleiche Größe:

enter image description here enter image description here

ich einen Befehl wie diesen ausführen können:

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

und ich werde diese bekommen:

enter image description here

Nun, das kann, oder vielleicht nicht das, was Sie wollen, so dass ich durch alle Avai laufen kann lable Füllmethoden wie folgt aus:

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 

, die diese, die die verschiedenen Ergebnisse zeigt, ergibt sich:

enter image description here

+0

Schöne Antwort @MarkSetchell. Sobald die Überblendung identifiziert ist, ist es einfacher, Ruby mit der richtigen Methode zu übersetzen, wenn sie definiert ist, oder zu wissen, was aufgrund dieser speziellen Methode angepasst werden muss. – Giuseppe

Verwandte Themen