Я недавно нашел способ достичь этого результата.Мне никогда не удавалось найти размер точки, который можно было бы использовать, чтобы уместить текст в ограничивающей рамке, и сначала я использовал get_type_metrics
, чтобы вычислить для меня шкалу X и Y.
metrics = text.get_type_metrics(image_canvas, image_text)
x_scale = container_width > metrics.width ? (container_width / metrics.width) : (metrics.width / container_width)
y_scale = container_height > metrics.height ? (container_height / metrics.height) : (metrics.height / container_height)
scale = container_height > metrics.height ? [x_scale, y_scale].min : [x_scale, y_scale].max
Тем не менее, это было немного странно, и недавно я использовал этот небольшой фрагмент.
image_canvas = Magick::Image.new(canvas_width, canvas_height)
text_container = Magick::Image.read("label:#{image_text}") {
self.stroke = 'transparent'
self.fill = '#0000A9'
self.size = "#{text_container_width}x#{text_container_height}"
}.first
image_canvas.composite!(text_container, text_x_offset, text_y_offset, Magick::SrcOverCompositeOp)
В основном все, что это делает, - это создание основного изображения (если вы хотите, чтобы на изображении было несколько элементов, и наложенияMagick::Image
объект поверх основного изображения, действующий как текстовый элемент с автоматическими размерами.
Или, если вам нужен многострочный текст, вы можете изменить label
на caption
следующим образом: Magick::Image.read("caption:#{image_text}")