Rails

2015-09-30 23 views
5

'da ImageMagick'i kullanarak opaklıklı renk yerleşimi Bir dizi görüntüyü bir araya getirmeden önce bir bindirme uygulamak için çalışıyoruz. Şu anda imagemagick, görüntüyü bir bindirme uygulamak yerine uygulanan renge dönüştürüyor gibi görünüyor. Dokümanlar, farklı olarak ne yapmamız gerektiği konusunda net değildir. Bunun hakkında bir fikriniz varsa memnun olurum. Kod aşağıdaki gibidir: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 

cevap

0

Ben RoR içine değilim, ama Copy_Opacity kompozit yöntem alfa kanalı (Copy_Opacity method) yerini, çünkü bunun yerine görüntü bindirme konusundaki katı renk ile görüntünüzü değiştiriyorsanız inanıyoruz. Yerine

:

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

Ruby bilmeyen Alpha Compositing (RMagick) - The colorize composite operation

+1

. Sadece imagemagick'in bu tür bir dökümantasyona sahip olması ... soooo fazla yazıyor ... –

3

Bkz ama yanlış harmanlama modunu var sanıyorum:

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

bu deneyin.

identify -list compose 

Çıktı

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 

ben size Magick::CopyOpacityCompositeOp tanımlanır dosyasında bakmak eğer benzer bir şey görebilirsiniz bekliyoruz: Komut satırında, sen mevcuttur karıştırma modlarını görebilirsiniz. Böyle bir komut çalıştırabilirsiniz

enter image description here enter image description here

: Yani, Mr Bean ve eflatun ben alırsam aynı boyutta dikdörtgen

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

ve bu alırsınız:

enter image description here

Şimdi, bu sizin istediğiniz gibi olabilir veya olmayabilir, bu yüzden tüm avai üzerinden koşabilirim Böyle ullanılabilir harmanlama modları: Çeşitli sonuçlarını gösteren bu verir

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 

: dostum çalışmak ama bunu denedim teşekkür etmedi

enter image description here

+0

Nice answer @MarkSetchell. Karışım tanımlandıktan sonra, tanımlanmışsa uygun yöntemle Ruby'ye çevirmek ya da söz konusu yönteme göre neyin uyarlanması gerektiğini bilmek daha kolaydır. – Giuseppe