Подтвердить что ты не робот

Текст в PNG для App Engine (Python)

Примечание. Я перекрестно размещаю это из группы App Engine, потому что у меня там нет ответов.

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

Другими словами, как вы собираетесь выводить строку юникода на вершина изображения известных размеров (например, 1024x768), так что текст будет максимально горизонтальным и центрированным вертикально? Есть ли способ сделать это App Engine, или есть некоторые внешний сервис, помимо App Engine, который может сделать это проще для меня, что вы могли бы порекомендовать (помимо запуска ImageMagick самостоятельно сервер)?

4b9b3361

Ответ 1

Решение №1. Библиотека изображений Pure 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 script.

Итак, существуют ограничения:

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

Решение №2. Внеуровневое преобразование текста в изображение.

Google AppEngine не предоставляет инструменты для рендеринга текста в виде растровых изображений, но Google Chart делает это. При правильном выборе параметров текст контурный текст просто передает простой текст в 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 недоступны
  • Только белый фон

Ответ 2

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

PyBMP

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

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

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

Обработка внешних изображений

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

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

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

Ответ 3

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

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

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

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

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

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

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

Ответ 4

Немного поздно, но я искал то же самое. Мне удалось нарисовать строку unicode (здесь Devanagari) на изображение и сохранить его как файл ".png", выполнив следующее:

# -*- coding: utf-8 -*-
import Image, ImageDraw, ImageFont

img = Image.new('L', (16,16), 255)
draw = ImageDraw.Draw(img)
text_to_draw = unicode('क','utf-8')
font = ImageFont.truetype('Path/to/font/file',12)
draw.text((2,2), text_to_draw, font = font)
del draw

img.save('image.png')

P.S. получил помощь от других сообщений в stackoverflow