2013-05-04 3 views
55

У меня есть приложение, которое загружает изображение, и когда пользователь нажимает на него, для этого изображения появляется текстовая область (с использованием jquery), где пользователь может написать текст на изображении. Который должен быть добавлен в Image.Добавить текст в изображение с помощью PIL

Проведя некоторое исследование, я понял, что PIL (Python Imaging Library) может помочь мне в этом. Поэтому я попробовал несколько примеров, чтобы увидеть, как это работает, и мне удалось написать текст на изображении. Но я думаю, что есть какая-то разница, когда я пытаюсь это использовать, используя Python Shell и в веб-среде. Я имею в виду, что текст в текстовом поле очень большой в px. Как я могу достичь такого же размера текста при использовании PIL как в текстовом поле?

Текст является многострочным. Как я могу сделать его многострочным на изображении, используя PIL?

Есть ли лучший способ, чем использование PIL? Я не совсем уверен, если это лучшая реализация.

HTML:

<img src="images/test.jpg"/> 

его изображение редактируется

var count = 0; 
$('textarea').autogrow(); 
$('img').click(function(){ 
    count = count + 1; 
    if (count > 1){ 
     $(this).after('<textarea />'); 
     $('textarea').focus(); 
    } 
}); 

JQuery, чтобы добавить текстовое поле. Также область текста - это положение: абсолютный и фиксированный размер.

Должен ли я разместить его внутри формы, чтобы получить координаты textarea на изображении? Я хочу написать текст на изображении, когда пользователь нажимает и сохраняет его на изображении.

+0

Почему вы хотите написать текст на изображении с помощью PIL (и я не уверен, что PIL помогает в этом). Разве вам не достаточно показать текст в оверлее, который чаще всего используется в слайдерах. – lalit

+1

Мне нужно это для проекта, я хочу, чтобы изображение было сохранено. Пил может рисовать текст на изображении с помощью ImageDraw, не знаю, есть ли другой способ. – Apostolos

+0

Будет полезно, если вы можете предоставить код Python, который вы используете? – lalit

ответ

106

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

# font = ImageFont.truetype(<font-file>, <font-size>) 
# font-file should be present in provided path. 
font = ImageFont.truetype("sans-serif.ttf", 16) 

Так что ваш код будет выглядеть нечто похожее на:

from PIL import Image 
from PIL import ImageFont 
from PIL import ImageDraw 

img = Image.open("sample_in.jpg") 
draw = ImageDraw.Draw(img) 
# font = ImageFont.truetype(<font-file>, <font-size>) 
font = ImageFont.truetype("sans-serif.ttf", 16) 
# draw.text((x, y),"Sample Text",(r,g,b)) 
draw.text((0, 0),"Sample Text",(255,255,255),font=font) 
img.save('sample-out.jpg') 

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

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

+1

Это моя первая мысль.Так что мне нужно, чтобы мои шрифты находились в определенной папке на моем веб-сервере, чтобы работать? Думаю, да. Обтекание текста? Есть стандартный способ или я должен его реализовать? – Apostolos

+0

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

+3

@lalit Я пробовал свой код на компьютере под управлением Windows, и у меня появилась ошибка для шрифта 'self.font = core.getfont (файл, размер, индекс, кодировка) IOError: не могу открыть ресурс'. Как я могу предоставить путь к файлу шрифта? – LWZ

8

Вы можете создать каталог «шрифты» в корне вашего проекта и поместить туда свой файл шрифтов (sans_serif.ttf). Затем вы можете сделать что-то вроде этого:

fonts_path = os.path.join(os.path.dirname(os.path.dirname(__file__)), 'fonts') 
font = ImageFont.truetype(os.path.join(fonts_path, 'sans_serif.ttf'), 24)