2015-09-30 23 views
5

Stiamo provando ad applicare una sovrapposizione su una serie di immagini prima di unirle in una sola. In questo momento sembra che imagemagick stia convertendo l'immagine nel colore applicato invece di applicare una sovrapposizione. I documenti non sono molto chiari su cosa dovremmo fare in modo diverso. Apprezzerei se tu avessi qualche idea su questo. Codice segue:Sovrapposizione di colore con opacità utilizzando 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 

risposta

0

Io non sono in RoR, ma credo che si sta sostituendo l'immagine con il colore solido, invece di sovrapporre l'immagine, perché Copy_Opacity metodo composito sostituisce il canale alfa (Copy_Opacity method).

Invece di:

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

Prova questa:

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

Vedi Alpha Compositing (RMagick) - The colorize composite operation

+1

che non ha funzionato compagno ma grazie ho provato. E 'solo che imagemagick ha una documentazione così gorgogliante ... così tanto da scrivere ... –

3

non parlo Ruby, ma ho il sospetto di avere il metodo di fusione sbagliata. Nella riga di comando, è possibile vedere i metodi di fusione disponibili con:

identify -list compose 

uscita

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 

mi aspetto si può vedere qualcosa di simile se si guarda nel file in cui è definito il vostro Magick::CopyOpacityCompositeOp. Quindi, se prendo Mr Bean e una magenta rettangolo delle stesse dimensioni:

enter image description here enter image description here

posso eseguire un comando come questo:

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

e vado a prendere questo:

enter image description here

Ora, questo può, o potrebbe non essere quello che vuoi, così posso correre attraverso tutto l'avai metodi di fusione lable come questo:

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 

che conferisce a questo che mostra i vari risultati:

enter image description here

+0

Bella risposta @ Mark Setchell. Una volta identificata la fusione, è più facile tradurre in Ruby con il metodo appropriato se è definita, o sapere cosa deve essere adattato a causa di quel particolare metodo. – Giuseppe

Problemi correlati