如何使用Python生成带有大写字母图像的优质Windows图标?

2 投票
2 回答
773 浏览
提问于 2025-04-16 23:53

我想要制作26个图标文件,分别是A.ico、B.ico,一直到Z.ico。每个图标需要包含两个尺寸的图片:一个是16x16像素、256种颜色的图像,另一个是32x32像素、同样是256种颜色的图像。图标上的文字颜色是黑色,字体可以选择Calibri,大小要适合这个正方形的空间。我希望能用Python的图像库来完成这个任务。

我知道其实可以通过其他方法来获取这些图标,但我想更好地学习如何使用PIL(Python图像库),所以希望能用它来完成这个工作。

2 个回答

2

这段话是基于@Mark Ransom的回答。谢谢你,Mark!这个方法对我有效,尽管'blackify'这个功能还不够完美。我还需要弄清楚怎么在Linux上创建一个.ico文件,而不使用icotool

# 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!')
2

首先,准备一张大的空白图片,然后在中间画上你想要的字符。接着,找到这个字符的边缘,从图片中提取出一个正方形区域,确保这个区域包含了整个字符。接下来,使用 thumbnail 函数,并选择 ANTIALIAS 选项,把图片缩小到需要的16x16或32x32的大小。最后,把颜色数量减少到256种:如何使用PIL减少颜色调色板

撰写回答