Дамп символов (глифов) из шрифта TrueType (TTF) в растровые изображения

У меня есть собственный шрифт TrueType (TTF), состоящий из набора значков, которые я хотел бы отображать в виде отдельных растровых изображений (GIF, PNG и т. д.) для использования в Интернете. Вы думаете, что это простая задача, но, видимо, нет? Здесь есть огромное количество программного обеспечения, связанного с TTF:

http://cg.scs.carleton.ca/~luc/ttsoftware.html

Но все это разные уровни «не совсем то, что я хочу», неработающие ссылки и / или трудно или невозможно скомпилировать в современной коробке Ubuntu - например. дампглифы (C++) и ttfgif (C) оба не компилируются из-за непонятных отсутствующих зависимостей. Любые идеи?


person lambshaanxy    schedule 20.04.2010    source источник


Ответы (5)


Попробуйте PIL от ImageDraw и Модуль ImageFont

Код будет примерно таким

import Image, ImageFont, ImageDraw

im = Image.new("RGB", (800, 600))

draw = ImageDraw.Draw(im)

# use a truetype font
font = ImageFont.truetype("path/to/font/Arial.ttf", 30)

draw.text((0, 0), "ABCDEFGHIJKLMNOPQRSTUVWXYZ", font=font)

# remove unneccessory whitespaces if needed
im=im.crop(im.getbbox())

# write into file
im.save("img.png")
person YOU    schedule 20.04.2010
comment
Благодарю вас! Это прекрасно работает, я добавил слегка измененную версию в качестве отдельного ответа. - person lambshaanxy; 20.04.2010

Вот рабочая реализация ответа S.Mark, которая выводит символы от «a» до «z» черным цветом в PNG правильного размера:

import Image, ImageFont, ImageDraw

# use a truetype font
font = ImageFont.truetype("font.ttf", 16)
im = Image.new("RGBA", (16, 16))
draw = ImageDraw.Draw(im)

for code in range(ord('a'), ord('z') + 1):
  w, h = draw.textsize(chr(code), font=font)
  im = Image.new("RGBA", (w, h))
  draw = ImageDraw.Draw(im)
  draw.text((-2, 0), chr(code), font=font, fill="#000000")
  im.save(chr(code) + ".png")
person lambshaanxy    schedule 20.04.2010

Более краткая и более надежная версия других ответов (которые отрезали для меня части некоторых глифов):

import string

from PIL import Image, ImageFont


point_size = 16
font = ImageFont.truetype("font.ttf", point_size)

for char in string.lowercase:
    im = Image.Image()._new(font.getmask(char))
    im.save(char + ".bmp")

Мне было бы интересно узнать, есть ли лучший способ создать изображение PIL из объекта ImagingCore, который возвращает font.getmask().

person jbg    schedule 11.07.2014
comment
Обратите внимание, что это создает изображения .bmp (это то, что мне нужно), но методы преобразования изображений PIL можно использовать для получения изображений других форматов. - person jbg; 11.07.2014

Python3

Рабочая реализация ответа S.Mark на вышеизложенное, но добавлены дополнительные комментарии, переменные и примеры к файлам шрифтов и символам. Я пытался быть описательным, но вы можете упростить работу так, как вам нужно.

Требования: PIL (подушка)

PIL ImageDraw и ImageFont

# pip install Pillow
from PIL import Image, ImageFont, ImageDraw

# use a truetype font (.ttf)
# font file from fonts.google.com (https://fonts.google.com/specimen/Courier+Prime?query=courier)
font_path = "fonts/Courier Prime/"
font_name = "CourierPrime-Regular.ttf"
out_path = font_path

font_size = 16 # px
font_color = "#000000" # HEX Black

# Create Font using PIL
font = ImageFont.truetype(font_path+font_name, font_size)

# Copy Desired Characters from Google Fonts Page and Paste into variable
desired_characters = "ABCČĆDĐEFGHIJKLMNOPQRSŠTUVWXYZŽabcčćdđefghijklmnopqrsštuvwxyzž1234567890‘?’“!”(%)[#]{@}/&\<-+÷×=>®©$€£¥¢:;,.*"

# Loop through the characters needed and save to desired location
for character in desired_characters:
    
    # Get text size of character
    width, height = font.getsize(character)
    
    # Create PNG Image with that size
    img = Image.new("RGBA", (width, height))
    draw = ImageDraw.Draw(img)
    
    # Draw the character
    draw.text((-2, 0), str(character), font=font, fill=font_color)
    
    # Save the character as png
    try:
        img.save(out_path + str(ord(character)) + ".png")
    except:

        print(f"[-] Couldn't Save:\t{character}")
person Carson Stevens    schedule 13.04.2021

Используйте какое-нибудь программное обеспечение для обработки изображений, такое как Gimp, чтобы отобразить все интересующие вас символы, а затем сохраните каждый из них в файл. Не быстро и не эффективно, но вы знаете, что получите.

person Mark Ransom    schedule 20.04.2010