- Укажите текст (представление ASCII-изображения)
- Выберите/загрузите шрифт с помощью ImageFont.truetype
- Получите размеры n заданного текста выбранный шрифт
- Создать пустое изображение размеров n
- Напишите указанный текст поверх изображения
Для дальнейшего контекста я бы хотел, чтобы текстовое изображение ascii сохранялось в виде списка (чтобы быть повторное соединение с помощью '\n'.join() или экранирование строки, содержащей '\n' новой строки символов.
Я попробовал это двумя способами:
- Используя метод getbbox ImageFont< /strong>
- Использование многострочных методов ImageDraw
Выполнение метода 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_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()
При увеличении размера шрифта изображение как будто манипулируется — кажется растянутым по горизонтали (сжатым по вертикали) при увеличении размера шрифта.
Мне интересно, может ли это быть вызвано самим конкретным шрифтом ( масштабирование шрифта) - или я упустил из виду что-то связанное с межстрочным интервалом.
- Жизнеспособен ли второй подход?
- Как мне решить проблему масштабирования/сжатия, чтобы текстовое изображение отображалось так же, как в файле .txt с тем же содержимым?
Подробнее здесь: https://stackoverflow.com/questions/791 ... in-pythons
Мобильная версия