2015-04-17 13 views
5

Tôi có hình nền mà tôi muốn thêm một hộp văn bản vào.Định vị chú thích trên nền bằng Rmagick hoặc ImageMagick

Tôi đang cố gắng tìm ra cách đặt một chú thích ở đúng vị trí trên đầu trang của nó. (Tôi đang sử dụng chú thích vì tôi cần tính năng bọc từ).

Hiện tại, tôi chỉ có thể hiển thị văn bản ở góc trên cùng bên trái , nhưng tôi cần phải có thể định vị vị trí bắt đầu từ vị trí thủ công.

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") 

Trả lời

2

Tôi thường sử dụng Magick::RVG cho việc này:

# 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

Một lời cảnh cáo: RVG không hỗ trợ bất kỳ loại gói văn bản nào theo như tôi biết. Tôi thấy điều này một cách khó khăn. Nếu bạn cần gói văn bản, tùy chọn duy nhất của bạn là tạo chú thích. Văn bản gói sang một bên, tôi thích RVG vì nó dễ dàng hơn để định vị chính xác trên một hình ảnh khác bằng cách sử dụng 'composite'. – ACIDSTEALTH

1

Sử dụng Magick::Draw, và nội dung truy vấn số liệu để xác định vị trí văn bản.

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

Dưới đây là một câu trả lời cho các dòng lệnh ImageMagick sử dụng convert. Nếu bạn muốn sử dụng phương pháp này với Rmagick, bạn sẽ phải tự mình chuyển nó.

  1. Kích thước của hộp văn bản. Khi bạn sử dụng -size NxM caption:"some text", văn bản sẽ tự động vừa với hộp với kích thước NxM.

  2. Vị trí cơ bản của hộp văn bản. Bạn có thể sử dụng -gravity với các đối số. lập luận cơ bản có thể là: Không, Center, Đông, Quên, Đông Bắc, Bắc, Tây Bắc, Đông Nam , Nam, Tây Nam, Tây.

    Các toán tử cơ bản -gravity này đặt hộp văn bản vào các vị trí rõ ràng được chỉ định bằng tên "nói" của chúng.

  3. Cài đặt vị trí chi tiết hơn. Tuy nhiên, bạn có thể sử dụng thêm -geometry +X+Y để dịch chuyển vị trí chính xác theo số pixel (+X dịch chuyển X pixel sang phải, -X dịch sang trái; +Y đẩy bằng Y pixel lên trên cùng, -Y đẩy về phía dưới cùng).

Hãy sử dụng hộp có chiều rộng 270 pixel và chiều cao 70 pixel.Đây là lệnh tôi đã sử dụng, lúc đầu với một văn bản ngắn:

mytext="Cheers\!" 

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

Dưới đây là kết quả (ảnh gốc trên đầu trang, hình ảnh với văn bản ở phía dưới):

Nếu bạn muốn đặt văn bản dài hơn vào cùng một hộp, chỉ cần sử dụng văn bản dài hơn :-)

Nhìn vào đây:

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 

Bây giờ chuyển sang hộp văn bản bằng 60 pixel bên phải và 30 pixel lên trên cùng:

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

cảm ơn, nó hoạt động! – ilgam

0

Vâng, bạn có thể kiểm soát nơi văn bản sẽ xuất hiện trên hình ảnh. Hiệu quả bạn tạo ra hai hình ảnh riêng biệt và chúng kết hợp chúng lại với nhau sau đó.

canvas là hình ảnh cơ sở bạn muốn tổng hợp ở trên cùng. overlay_text là khối văn bản sẽ xuất hiện ở trên cùng.

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') 

Các overlay_text khối sử dụng caption mà sẽ tự động quy mô the_text để phù hợp trong self.size.

Bạn có thể sửa kích thước phông chữ bằng self.pointsize = 20 nếu bạn muốn nhưng nếu văn bản của bạn lớn hơn kích thước vừa với kích cỡ bạn xác định, nó sẽ bị cắt.

Khi bạn có hai hình ảnh, bạn có thể tạo tổng hợp bằng cách sử dụng Image#composite(source_image, gravity, x, y, composite_operator) mang lại cho bạn trọng số tiêu chuẩn và x & điều khiển bù trừ y. Trong trường hợp này lớp phủ văn bản được tổng hợp 30 pixel lên từ giữa hình ảnh canvas nền.

Các vấn đề liên quan