Как я могу нарисовать зеркальный текст на изображение, используя ImageMagick? - PullRequest
2 голосов
/ 28 ноября 2011

Я использую ImageMagick (через MiniMagick Ruby Gem), чтобы обрезать изображение, я также добавляю аннотацию к его верхней части, но я хочу, чтобы оно было зеркальным.

Я знаю, что в ImageMagick есть команда 'flop', которая зеркально отображает изображение, но я не уверен, как сгенерировать текст, вставить его и скомпоновать на моем изображении.

Вот как я сейчас рисую текст (без зеркального отображения). В этом коде используется MiniMagick, но он довольно быстро преобразуется в реальные команды ImageMagick.

image.combine_options do |c|
  c.resize "1000"
  c.font Rails.root.join('app/assets/fonts/Menlo.ttc').to_s
  c.fill '#888888'
  c.pointsize '16'
  c.draw "text 0,0 '#{annotation}'"
end

Как я могу изменить или заменить это для рисования зеркального текста?

Ответы [ 2 ]

1 голос
/ 23 августа 2012

Теперь, когда Натан признал, что он «знаком» с -flip и -flop только для изображений, давайте покажем ему, как его можно использовать, чтобы, тем не менее, переворачивать и подбрасывать текстовые аннотации на неизмененные изображения.

См. Эти два примера:

Normal text Mirrored text

Слева с обычным текстом, справа с зеркальным текстом (зеркальное отображение слева направо - Натан не ответил на вопрос, хочет ли он этого или хочет зеркальное отображение сверху вниз).

Как это было сделано?

примечание к левому изображению было выполнено с помощью следующей команды:

convert                   \
   logo:                  \
  -fill white             \
  -undercolor '#00000080' \
    \(                                  \
      -gravity west                     \
      -pointsize 32                     \
      -annotate +0+40                   \
       " Dude! Listen, don't argue... " \
    \)                                  \
  -scale 310x             \
   normal.png

Так что этот результат является основой для следующего шага. На следующем шаге мы изменим эту команду, чтобы создать зеркальную текстовую аннотацию . Но, поскольку мы не можем писать зеркальный текст напрямую, мы используем один из многих приемов в наших рукавах:

  1. Сначала зеркально отразить изображение (сначала -flop).
  2. Напишите обычный текст на зеркальном изображении.
  3. Зеркально отразить полученное изображение еще раз (секунда -flop). Сюда...
    • ... основное изображение вернулось в нормальное состояние,
    • ... текст аннотации теперь зеркально отражен.

И это приводит к команде аннотации слева изображения :

convert                   \
   logo:                  \
  -flop                   \
  -fill white             \
  -undercolor '#00000080' \
    \(                                  \
      -gravity east                     \
      -pointsize 32                     \
      -annotate +0+40                   \
       " Dude! Listen, don't argue... " \
    \)                                  \
  -flop                   \
  -scale 310x             \
   mirrored.png

Легко, а?

(Обратите внимание, что нам также пришлось изменить гравитацию с запада на восток, чтобы текст появлялся на одном месте ...)

Теперь Натан сам должен перевести этот алгоритм на язык Minimagick.

1 голос
/ 13 августа 2012

Во-первых , вы должны для своего кода Minimagick выполнить 'непосредственный перевод в реальные команды ImageMagick' , если вы действительно заинтересованы в получении максимально возможного ввода. Не каждый здесь хочет сначала изучить Minimagick, прежде чем он сможет присоединиться к его предложениям.

Второй , вы не сказали, каким образом вы хотите, чтобы ваш текст зеркально отображался: влево-вправо? Сверху вниз? Комбинированное

Третий , попробуйте заменить эти 2 строки

c.pointsize '16'
c.draw "text 0,0 '#{annotation}'"

по этим 3 строкам

c.pointsize '16'
c.draw "text 0,0 '#{annotation}'"
c.flop

или по этим 3 строкам

c.pointsize '16'
c.draw "text 0,0 '#{annotation}'"
c.flip

или по этим 4 строкам

c.pointsize '16'
c.draw "text 0,0 '#{annotation}'"
c.flip
c.flop
...