Это основано на ответе @Mark Ransom. Спасибо, Марк!
Это сработало для меня, хотя функция 'blackify' все еще несовершенна.
Мне все еще нужно выяснить, как создать файл .ico без использования icotool для Linux.
# This script generates icon files from the two images.
# Uses Python 2.6.5, uses the Python Imaging Library
import Image
import ImageDraw
import ImageFont
letters = [chr(i + ord('A')) for i in range(26)]
default_huge = ImageFont.load_default()
large_size = 1000
lim = large_size + 1
# Apparently I can use the same size for the font.
calibri_huge = ImageFont.truetype("calibri.ttf", large_size)
def crop_letter(img):
minx, maxx, miny, maxy = lim, -lim, lim, -lim
for x in range(large_size):
for y in range(large_size):
if sum(img.getpixel((x, y))) == 3 * 255: continue
# Else, found a black pixel
minx = min(minx, x)
maxx = max(maxx, x)
miny = min(miny, y)
maxy = max(maxy, y)
return img.crop(box = (minx, miny, maxx, maxy))
# This works for me 95% of the time
def blackify(color):
return 255 * (color > 240)
for letter in letters:
# A bit wasteful, but I have plenty of RAM.
img = Image.new("RGB", (large_size, large_size), "white")
draw = ImageDraw.Draw(img)
draw.text((0,0), letter, font = calibri_huge, fill = "black")
img32 = crop_letter(img)
img16 = img32.copy()
img32.thumbnail((32, 32), Image.ANTIALIAS)
img16.thumbnail((16, 16), Image.ANTIALIAS)
img32 = Image.eval(img32, blackify)
img16 = Image.eval(img16, blackify)
## Not needed
## # Apparently this is all it takes to get 256 colors.
## img32 = img32.convert('P')
## img16 = img16.convert('P')
img32.save('icons3/{0}32x32.bmp'.format(letter))
img16.save('icons3/{0}16x16.bmp'.format(letter))
# break
print('DONE!')