I have a background image that I want to add a text box to.
I am trying to figure out how to position a caption in the right spot on top of it. (I'm using caption because I need the word wrap feature).
Right now, I'm only able to get the text to show on the top left corner, but I need to be able to manually position where it starts.
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")
Here is an answer for the ImageMagick command line using convert
. If you want to use this method with Rmagick, you'll have to port it yourself.
Size of the text box. When you use -size NxM caption:"some text"
, the text will fit automatically into the box with the size NxM
.
Basic location of the text box. You can use -gravity
with arguments. Possible basic arguments are: None,
Center,
East,
Forget,
NorthEast,
North,
NorthWest,
SouthEast,
South,
SouthWest,
West.
These basic -gravity
operators place the text box into the obvious spots indicated by their "speaking" names.
Finer-grained location setting. However, you can additionally use -geometry +X+Y
to shift the exact locations by a number of pixels (+X
shifts X pixels to the right, -X
shifts to the left; +Y
pushes by Y pixels to the top, -Y
pushes towards the bottom).
Let's use a box with 270 pixels width and 70 pixels height. Here is the command I used, at first with a short text:
mytext="Cheers\!"
convert \
-background '#0008' \
-gravity center \
-fill white \
-size 260x70 caption:"${mytext}" \
funny-santa.jpg \
+swap \
-gravity south \
-composite \
funny-santa---1.jpg
Here is the result (original image on top, image with text on bottom):
If you want to put longer text into the same box, just use longer text :-)
Look here:
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
Now shift the text box by 60 pixels to the right and by 30 pixels to the top:
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
I usually use Magick::RVG
for this:
# 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' }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With