我有一个自定义的TrueType字体(TTF),它由一堆图标组成,我想将它们呈现为单独的位图(GIF,PNG等),以便在Web上使用。你认为这是一项简单的任务,但显然不是吗?这里有大量与TTF相关的软件:
http://cg.scs.carleton.ca/~luc/ttsoftware.html
但是所有不同级别的“不是我想要的”,断开的链接和/或很难在现代Ubuntu盒子上编译 - 例如。 dumpglyphs(C ++)和ttfgif(C)由于隐藏的缺失依赖性而无法编译。有什么想法吗?
答案 0 :(得分:6)
代码就是这样的
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")
答案 1 :(得分:2)
这是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")
答案 2 :(得分:2)
其他答案的更简洁,更可靠的版本(为我切断了部分字形的部分):
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")
我有兴趣知道是否有更好的方法从font.getmask()
返回的ImagingCore对象构造PIL图像。
答案 3 :(得分:1)
S.Mark 对上述答案的有效实现,但在字体文件和字符中添加了更多注释、变量和示例。 我已尝试进行描述,但您可以根据需要简化工作。
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}")
答案 4 :(得分:-1)
使用像Gimp这样的成像软件显示您感兴趣的所有字符,然后将每个字符保存到文件中。没有快速或有效,但你知道你会得到什么。