Текст к PNG на механизме приложения (Python)

Примечание: Я осуществляю кросспостинг этого от группы Механизма Приложения, потому что я не получил ответов там.

Как часть моего сайта о Японии, у меня есть функция, где пользователь может получить большой PNG для использования в качестве настольного фона, который показывает имя пользователя на японском языке. После переключения моего сайта, размещающего полностью к Механизму Приложения, я удалил эту конкретную функцию, потому что я не мог найти способ представить текст к PNG с помощью изображения API.

Другими словами, как Вы пошли бы о выводе строки unicode сверху изображения известных размеров (1024x768, например), так, чтобы текст был как можно больше горизонтально, и центрируется вертикально? Существует ли способ сделать, это - Механизм Приложения или является там некоторым внешним сервисом помимо Механизма Приложения, который мог сделать это легче для меня, которого Вы могли рекомендовать (помимо выполнения ImageMagick на Вашем собственном сервере)?

24
задан Bemmu 12 March 2010 в 08:28
поделиться

3 ответа

Решение #1. Библиотека изображений на чистом Python.

Вы можете попробовать подключить PyPNG к вашему приложению. PyPNG - это чистая библиотека Python для создания изображений PNG. Она зависит от модуля zlib, который разрешен на AppEngine, поэтому PyPNG должен работать на AppEngine. Просто используйте объекты StringIO вместо файлов и записывайте в них данные PNG.

Бесстыдно адаптированный пример PyPNG, как сделать растровое PNG изображение:

import png
from StringIO import StringIO

# bitmap data
s = ['110010010011',
     '101011010100',
     '110010110101',
     '100010010011']
s = map(lambda x: map(int, x), s)

f = StringIO()
w = png.Writer(len(s[0]), len(s), greyscale=True, bitdepth=1)
w.write(f, s)

# binary PNG data
print f.getvalue()

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

И вам все еще нужно выяснить, как растеризовать текст для получения растровых данных. Самый простой способ, вероятно, состоит в том, чтобы просто хранить растровые изображения всех символов вокруг (по существу, используя растровый шрифт).

Для растеризации ASCII текста с помощью PyPNG посмотрите на скрипт texttopng.

Итак, ограничения:

  • Возможно, медленный (нужно проверить)
  • Растеризация глифов требует решения

Решение №2. Внесайтовый рендеринг текста в изображение.

Google AppEngine не предоставляет инструментов для рендеринга текста в растровые изображения, но Google Charts предоставляет. При правильном выборе параметров контурный текст диаграммы просто рендерит простой текст в PNG-изображения.

Например, http://chart.apis.google.com/chart?chst=d_text_outline&chld=000000|32|h|FFFFFF|_|Render text to image| with Google Charts. |Some Unicode too:|Здра́вствуйте|こんにちは|नमस्ते|你好|שלו выдает следующее:

text-to-image on Google Charts

Ограничения:

  • Вы не можете генерировать изображения размером более 300000 пикселей
  • Настройки стиля и шрифта ограничены
  • Некоторые скрипты Unicode недоступны
  • Только белый фон
29
ответ дан 28 November 2019 в 23:27
поделиться

Я столкнулся с той же проблемой при записи текста на изображение. Проблема заключается в том, что любые библиотеки изображений, используемые в движке приложений Google, должны быть чистым Python, что исключает PIL.

PyBMP

PyBMP - это чистая библиотека Python, которая может выполнять простой рендеринг текста. Оттуда вы можете использовать библиотеку изображений Google, чтобы объединить полученное растровое изображение с другими изображениями. Ниже приведен пример кода. Обратной стороной является то, что в библиотеке отсутствуют более приятные функции, такие как сглаживание и точный контроль над шрифтами, поэтому текст, который она отображает, выглядит паршиво. Он также может хорошо обрабатывать Юникод, а может и не работать.

# Create the image
text_img = bmp.BitMap(300,35,bmp.Color.WHITE)
# bmpfont_Tw_Cen_MT_30 is a generated file using PyBMP's tool
text_img.setFont(bmpfont_Tw_Cen_MT_30.font_data)
text_img.setPenColor( bmp.Color.BLACK )
text_img.drawText(name, 0, 0)

После этого вы можете использовать составную функцию Google для text_img.getBitmap () , как и любое другое изображение.

Внешняя обработка изображений

Если текст недостаточно хорош (это не для моего проекта), альтернативным решением является установка внешнего сервера в такой службе, как Rackspace, исключительно для обработки изображений. Настройте обработчик HTTP, который обрабатывает ваши изображения с помощью PIL, а затем возвращает полученное изображение. Оттуда вы можете либо

  • загрузить результат прямо на свой сервер статического хостинга файлов (например, s3), либо
  • получить результат сгенерированного текстового изображения с помощью библиотеки urlfetch движка приложения и выполнить остальную часть компоновки в движке приложения

Не очень красиво, но выполняет свою работу.

9
ответ дан 28 November 2019 в 23:27
поделиться

[Остановить нажатие: как следует из комментария - этот ответ не работает в Googe App Engine.]

Библиотека изображений Python ( PIL ) может выполнить это.

Вы можете загрузить изображение, нарисовать на нем текст Unicode с помощью функции ImageDraw.text ().

Возможно, вам придется вызвать ImageDraw.textsize () несколько раз с разными размерами шрифта, чтобы найти самый крупный шрифт, который подойдет.

Наконец, вы можете сохранить изображение .png в файл (или отправить его напрямую).

Протестируйте с большими изображениями, если вы запускаете его из контекста веб-сервера, чтобы убедиться, что вы можете выделить достаточно памяти для обработки больших файлов PNG.

(Правильно ли я ответил на ваш вопрос? Я не знаю, можно ли использовать PIL в Google App Engine.)

3
ответ дан 28 November 2019 в 23:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: