Как динамически получать размеры текста перед записью в изображение в библиотеке Python Pillow?Python

Программы на Python
Ответить
Anonymous
 Как динамически получать размеры текста перед записью в изображение в библиотеке Python Pillow?

Сообщение Anonymous »

Я хочу динамически записывать текст в новое пустое изображение, используя библиотеку изображений Python. Этот процесс будет работать следующим образом:
  • Укажите текст (представление ASCII-изображения)
  • Выберите/загрузите шрифт с помощью ImageFont.truetype
  • Получите размеры n заданного текста выбранный шрифт
  • Создать пустое изображение размеров n
  • Напишите указанный текст поверх изображения
Проблема Я сталкиваюсь с этапом 3 и далее: получение размеров и последующая запись.
Для дальнейшего контекста я бы хотел, чтобы текстовое изображение ascii сохранялось в виде списка (чтобы быть повторное соединение с помощью '\n'.join() или экранирование строки, содержащей '\n' новой строки символов.
Я попробовал это двумя способами:
  • Используя метод getbbox ImageFont< /strong>
  • Использование многострочных методов ImageDraw
При отсутствии ImageFont getsize, я попытался использовать getbbox. Кажется, это не очень хорошо обрабатывает новые строки.
Выполнение метода getbbox, похоже, возвращает правдоподобную ширину в пикселях, но высота, похоже, не увеличивается вверх независимо от количества строк.< /p>
Вот что я попробовал в первую очередь:

Код: Выделить всё

from PIL import Image, ImageDraw, ImageFont

image_lines = [] #is a list of strings where each string represents a row of the ascii image
text = '\n'.join(image_lines)

font_path = CourierPrime-Regular.ttf
font = ImageFont.truetype(font_path,size=3)

text_dimensions = font.getbbox(text)
text_width = text_dimensions[2] - text_dimensions[0]
text_height = text_dimensions[3] - text_dimensions[1]

print(f'TEXT WIDTH: {text_width}\nTEXT HEIGHT: {text_height}') #height remains the same regardless of line count
В этом случае text_dimensions содержит четыре кортежа: (левый, нижний, правый, верхний), следовательно, text_width представляет (правый — левый), а
text_height представляет (верхний — верхний) ниже)
Похоже, сколько бы строк я ни добавлял в «текст», характеристика высоты остается постоянной.
После дальнейшего прочтения документации для ImageDraw модуль, я встретил несколько многострочных методов (а именно multiline_textbox и multiline_text). Я решил, что могу:
  • передать текст в метод multiline_textbox, используя фиктивное изображение, чтобы получить размеры,
  • создать новое пустое изображение с размерами, эквивалентными текстовому полю
    < /li>
    записать многострочный текст на изображение, используя multiline_text
Вот что я попробовал дальше:

Код: Выделить всё

from PIL import Image, ImageFont, ImageDraw

image_lines = [] #list containing strings, where each string represents a row of the ascii image
text = '\n'.join(image_lines)

font_path = r'CourierPrime-Regular.ttf'
font = ImageFont.truetype(font_path,size=3)

#dummy image, needed to construct Draw object
img = Image.new('RGB',(1,1))
draw = ImageDraw.Draw(img)

#check for text dimensions
text_dimensions = draw.multiline_textbbox((0,0),
text=text,
font=font)
text_width = text_dimensions[2] - text_dimensions[0]
text_height = text_dimensions[3] - text_dimensions[1]

#for debugging
print(f'TEXT WIDTH: {text_width}\nTEXT HEIGHT: {text_height}')
print(text_dimensions)

#creating new image of required size and new Draw object
img = Image.new('RGB',
(text_width,text_height),
color='#000000')
draw = ImageDraw.Draw(img)

#drawing text over image
draw.multiline_text((0,0),
text=text,
fill='#ffffff',
font=font)

img.show()
Кажется, концептуально это работает, но я сталкиваюсь с некоторыми проблемами с масштабированием при изменении размера шрифта (заданного в переменной «font»).
При увеличении размера шрифта изображение как будто манипулируется — кажется растянутым по горизонтали (сжатым по вертикали) при увеличении размера шрифта.
Мне интересно, может ли это быть вызвано самим конкретным шрифтом ( масштабирование шрифта) - или я упустил из виду что-то связанное с межстрочным интервалом.
  • Жизнеспособен ли второй подход?
  • Как мне решить проблему масштабирования/сжатия, чтобы текстовое изображение отображалось так же, как в файле .txt с тем же содержимым?


Подробнее здесь: https://stackoverflow.com/questions/791 ... in-pythons
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»