Как создать качественные иконки Windows с изображениями заглавных букв внутри с помощью Python? - PullRequest
2 голосов
/ 18 августа 2011

Я хочу получить 26 файлов (для начала): A.ico, B.ico, ... Z.ico, где они состоят из 256-цветного изображения 16x16 и 256-цветного изображения 32x32, гдецвет текста черный, а шрифт - скажем, Calibri, а размер - все, что лучше всего вписывается в квадрат.Я хотел бы сделать это, используя библиотеку изображений Python, если это возможно.

Я знаю, что, вероятно, я могу получить свои значки другими способами, но я хотел бы научиться использовать PIL лучше и хотел бы использовать егодля поставленной задачи.

Ответы [ 2 ]

2 голосов
/ 19 августа 2011

Это основано на ответе @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!')
2 голосов
/ 18 августа 2011

Начните с большого пустого изображения и нарисуйте символ в центре. Найдите края персонажа и извлеките квадрат из изображения, которое включает в себя все персонажа. Используйте функцию thumbnail с опцией ANTIALIAS, чтобы уменьшить ее до требуемого размера 16x16 или 32x32. Затем уменьшите количество цветов до 256: Как уменьшить цветовую палитру с помощью PIL

...