2015-04-17 8 views
5

का उपयोग कर पृष्ठभूमि पर एक कैप्शन पोजिशन करना मेरे पास एक पृष्ठभूमि छवि है जिसे मैं एक टेक्स्ट बॉक्स जोड़ना चाहता हूं।Rmagick या ImageMagick

मैं यह पता लगाने की कोशिश कर रहा हूं कि इसके शीर्ष पर दाएं स्थान पर कैप्शन कैसे रखें। (मैं कैप्शन का उपयोग कर रहा हूं क्योंकि मुझे शब्द लपेटने की सुविधा चाहिए)।

अभी, मैं केवल शीर्ष बाएं कोने पर टेक्स्ट दिखाने में सक्षम हूं, लेकिन मुझे मैन्युअल रूप से यह कहां से शुरू करने में सक्षम होना चाहिए।

require 'RMagick' 
require 'Pry' 
include Magick 

text = "Lorem ipsum dolor sit amet" 

img = ImageList.new('template001.jpg') 
img << Magick::Image.read("caption:#{text}") { 
    self.fill = '#FFFFFF' 
    self.font = "Helvetica" 
    self.pointsize = 32 
    self.size = "550x400" 
    self.background_color = "none" 
}.first 

a = img.flatten_images 

a.write("out.jpg") 

उत्तर

2

मैं आमतौर पर इस बात के लिए Magick::RVG का उपयोग करें:

# Create a canvas of the required size 
rvg = Magick::RVG.new(550, 400) do |canvas| 

    # Set the background image 
    canvas.background_image = Magick::Image.read("bg.jpg").first 

    # Create a style group for font and fill options 
    canvas.g.styles(font_size: 21, fill: "#FFFFFF", font: "Helvetica") do |grp| 

    # Output text at the desired location 
    grp.text(150, 150, "caption:Lorem ipsum dolor sit amet") 
    end 
end 

# Extract canvas as an image 
img = rvg.draw 

# Set the color profile to sRGB 
img.colorspace = RGBColorspace 

# Output as a PNG (you'll want to write this output to a file or save in a db) 
img.to_blob { self.format = 'PNG' } 
+0

चेतावनी का एक शब्द: आरवीजी जहां तक ​​मुझे पता है कि किसी भी प्रकार के टेक्स्ट रैपिंग का समर्थन नहीं करता है। मुझे यह सब बड़ी कठिनाईयों का सामना करने के बाद मिला है। यदि आपको टेक्स्ट रैपिंग की आवश्यकता है, तो आपका एकमात्र विकल्प कैप्शन बनाना है। पाठ को अलग-अलग लपेटना, मैं आरवीजी पसंद करता हूं क्योंकि 'समग्र' का उपयोग करके दूसरी छवि के ठीक नीचे स्थिति रखना आसान है। – ACIDSTEALTH

1

उपयोग Magick::Draw, और क्वेरी पाठ मैट्रिक्स पाठ स्थिति।

require 'RMagick' 
include Magick 

text = "Hello\nworld" 

img = ImageList.new('wizard:') 
draw = Draw.new() { 
    self.fill = '#FF00FF' 
    self.font = "Helvetica" 
    self.pointsize = 32 
} 
draw.text_align(RightAlign) 
# Query font metrics for positioning (or get_multiline_type_metrics) 
text_metrics = draw.get_type_metrics(text) 
draw.text(img.columns, text_metrics.height, text) 
draw.draw(img) 

enter image description here

4

यहाँ ImageMagick कमांड convert का उपयोग कर लाइन के लिए एक जवाब है। यदि आप Rmagick के साथ इस विधि का उपयोग करना चाहते हैं, तो आपको इसे स्वयं पोर्ट करना होगा।

  1. टेक्स्ट बॉक्स का आकार। जब आप -size NxM caption:"some text" का उपयोग करते हैं, तो पाठ स्वचालित रूप से NxM आकार वाले बॉक्स में फिट हो जाएगा।

  2. टेक्स्ट बॉक्स का मूल स्थान। आप तर्क के साथ -gravity का उपयोग कर सकते हैं। संभव बुनियादी तर्क हैं: कोई नहीं, केंद्र, पूर्व, भूल जाओ, पूर्वोत्तर, उत्तर, उत्तर पश्चिम, दक्षिण दक्षिण, दक्षिण पश्चिम, पश्चिम।

    ये मूल -gravity ऑपरेटर टेक्स्ट बॉक्स को उनके "बोलने वाले" नामों से संकेतित स्पष्ट स्पॉट में डाल देते हैं।

  3. बेहतर अनाज स्थान सेटिंग। हालांकि, आप अतिरिक्त पिक्सेल (+X दाईं ओर X पिक्सल को दाएं स्थानांतरित करने के लिए -geometry +X+Y का उपयोग कर सकते हैं, -X बाईं ओर शिफ्ट; +Y शीर्ष पर वाई पिक्सेल द्वारा धक्का देता है, -Y नीचे की तरफ धक्का देता है)।

के 270 पिक्सेल चौड़ाई और 70 पिक्सेल ऊंचाई के साथ एक बॉक्स का उपयोग करते हैं।

mytext="Cheers\!" 

convert       \ 
    -background '#0008'    \ 
    -gravity center     \ 
    -fill white      \ 
    -size 260x70 caption:"${mytext}" \ 
    funny-santa.jpg     \ 
    +swap       \ 
    -gravity south     \ 
    -composite      \ 
    funny-santa---1.jpg 

यहाँ परिणाम (शीर्ष पर मूल छवि, नीचे पाठ के साथ छवि) है::

तो यहाँ आदेश मैं एक छोटे पाठ के साथ पहली बार में इस्तेमाल किया है, आप एक ही बॉक्स में लंबा टेक्स्ट रखना चाहते हैं, बस अब पाठ का उपयोग :-)

यहाँ देखो:

mytext="Dear Kids\! One day you'll learn everything about Santa Claus. On that day, please also remember what they told you about Jesus." 

convert       \ 
    -background '#0008'    \ 
    -gravity center     \ 
    -fill white      \ 
    -size 260x70 caption:"${mytext}" \ 
    funny-santa.jpg     \ 
    +swap       \ 
    -gravity south     \ 
    -composite      \ 
    funny-santa---2.jpg 

अब शीर्ष करने के लिए सही करने के लिए 60 पिक्सल द्वारा 30 पिक्सल द्वारा पाठ बॉक्स बदलाव:

mytext="Dear Kids\! Pushing text boxes around to place captions at precise locations inside an image is easy." 

convert       \ 
    -background '#0008'    \ 
    -gravity center     \ 
    -geometry +60+30     \ 
    -fill white      \ 
    -size 260x70 caption:"${mytext}" \ 
    funny-santa.jpg     \ 
    +swap       \ 
    -gravity south     \ 
    -composite      \ 
    teaching-santa.jpg 

+0

धन्यवाद, यह काम करता है! – ilgam

0

हाँ, आप नियंत्रित कर सकते हैं जहां पाठ के ऊपर दिखाई देता है छवि। प्रभावी रूप से आप दो अलग-अलग छवियां बनाते हैं और उन्हें बाद में एक साथ जोड़ते हैं।

canvas वह आधार छवि है जिसे आप शीर्ष पर मिश्रित करना चाहते हैं। overlay_text टेक्स्ट ब्लॉक है जो शीर्ष पर जाएगा।

require 'RMagick' 
include Magick 

the_text = 'This is the text how will it wrap????' 
canvas = ImageList.new("some_input_file.png") 

overlay_text = Image.read("caption:#{the_text}") do 
    self.size = "300x200" 
    self.font = "Tahoma" 
end.first 

result = canvas.composite(overlay_text, Magick::CenterGravity, 0,-30, Magick::OverCompositeOp) 

result.write('out.png') 

overlay_text ब्लॉक caption जो स्वचालित रूप से the_text पैमाने self.size भीतर फिट करने के लिए होगा का उपयोग करता है।

यदि आप चाहते हैं तो आप self.pointsize = 20 के साथ फ़ॉन्ट आकार को ठीक कर सकते हैं, लेकिन यदि आपका टेक्स्ट परिभाषित आकार में फिट बैठने से बड़ा है तो इसे फसल किया जाएगा।

एक बार जब आप अपनी दो छवियां प्राप्त कर लेते हैं तो आप Image#composite(source_image, gravity, x, y, composite_operator) का उपयोग करके एक समग्र कर सकते हैं जो आपको मानक गुरुत्वाकर्षण और x & वाई ऑफ़सेट नियंत्रण देता है। इस उदाहरण में टेक्स्ट ओवरले बेस कैनवास छवि के केंद्र से 30 पिक्सेल मिश्रित है।

संबंधित मुद्दे