我想获得26个文件(对于初学者):A.ico,B.ico,… Z.ico,它们由16×16的256色图像和32×32的256色图像组成,其中文字是黑色的,字体是…说Calibri,尺寸 – 什么最适合广场。 如果可能,我想使用Python图像库来做到这一点。
我知道我可以通过其他方式获得我的图标,但是我想学习更好地使用PIL,并且希望将其用于手头的任务。
从一个大的空白图像开始,在中间画一个字符。 找到角色的边缘并从包含所有角色的图像中提取一个正方形。 使用ANTIALIAS
选项的thumbnail
功能将其缩小到所需的16×16或32×32大小。 然后将颜色数量减少到256: 如何用PIL减少调色板
这是基于@Mark Ransom的回答。 谢谢,马克! 这对我很有效,尽管“黑化”功能还不完善。 我仍然需要弄清楚如何在不使用Linux的icotool的情况下创建一个.ico文件。
# 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!')