Как создавать качественные значки окон с изображениями заглавных букв внутри, используя Python?

77
6

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


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

спросил(а) 2021-01-19T15:49:46+03:00 6 месяцев, 1 неделя назад
1
Решение
78

Это основано на ответе @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!')

ответил(а) 2021-01-19T15:49:46+03:00 6 месяцев, 1 неделя назад
77

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

ответил(а) 2021-01-19T15:49:46+03:00 6 месяцев, 1 неделя назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема