Возможно ли использование этикетки для изображения с помощью Rmagick? - PullRequest
2 голосов
/ 27 мая 2011

Самая большая хитрость в использовании меток для генерации изображений определенного «-size» - НЕ указывать «-pointsize» для метки.Когда это произойдет, IM получит свободу выбора размера шрифта, который наилучшим образом соответствует запрашиваемому размеру изображения.То есть нарисованный текст будет скорректирован в соответствии с заданным размером! 1

Этот отрывок из документации ImageMagick показывает, что довольно просто заставить текст вписаться в размер изображения.

Я пытаюсь найтиспособ размещения текста внутри изображения Rmagick с фиксированной шириной без успеха.

    text = Draw.new
    text.annotate layer, layer_data['width'], layer_data['height'], layer_data['x'], layer_data['y'], layer_content do

      self.font_family = 'arial'
      self.fill = '#000000'

    end

Я логически пытался использовать аннотирование без размера точек, но Rgmagick просто поменял размер точек по умолчанию на 12.

Есть ли способ с Rmagick, чтобы позволить библиотеке вычислить лучшееточечный размер, поэтому текст помещается в изображение фиксированной ширины, как в ImageMagick.

1 Ответ

3 голосов
/ 06 марта 2013

Я недавно нашел способ достичь этого результата.Мне никогда не удавалось найти размер точки, который можно было бы использовать, чтобы уместить текст в ограничивающей рамке, и сначала я использовал 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}")

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...