Reputation: 23072
I have a custom TrueType font (TTF) that consists of a bunch of icons, which I'd like to render as individual bitmaps (GIF, PNG, whatever) for use on the Web. You'd think this is a simple task, but apparently not? There is a huge slew of TTF-related software here:
http://cg.scs.carleton.ca/~luc/ttsoftware.html
But it's all varying levels of "not quite what I want", broken links and/or hard to impossible to compile on a modern Ubuntu box -- eg. dumpglyphs (C++) and ttfgif (C) both fail to compile due to obscure missing dependencies. Any ideas?
Upvotes: 8
Views: 10004
Reputation: 340
Working implementation of S.Mark's answer of the above, but added some more comments, variables, and examples to font files & characters. I've tried to be descriptive, but you can simplify to work how you need it to.
PIL's ImageDraw and ImageFont module
# 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}")
Upvotes: 2
Reputation: 5268
A more concise, and more reliable version of the other answers (which cut off parts of some glyphs for me):
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")
I’d be interested to know whether there’s a better way to construct a PIL Image from the ImagingCore object that font.getmask()
returns.
Upvotes: 6
Reputation: 23072
Here's a working implementation of S.Mark's answer that dumps out chars 'a' to 'z' in black into correctly-sized PNGs:
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")
Upvotes: 4
Reputation: 123937
Try PIL's ImageDraw and ImageFont module
Code would be something like this
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")
Upvotes: 12
Reputation: 308538
Use some imaging software like the Gimp to display all the characters you're interested in, then save each one to a file. Not fast or efficient, but you know what you'll be getting.
Upvotes: -1