54 lines
1.9 KiB
Python
Executable file
54 lines
1.9 KiB
Python
Executable file
#!/usr/bin/python
|
|
# -*- coding: utf-8 -*-
|
|
# vi:si:et:sw=4:sts=4:ts=4
|
|
|
|
from __future__ import division
|
|
from optparse import OptionParser
|
|
import os
|
|
import sys
|
|
|
|
import Image
|
|
import ImageDraw
|
|
|
|
data_root = os.path.join(os.path.dirname(__file__), 'data')
|
|
|
|
def main():
|
|
|
|
parser = OptionParser()
|
|
parser.add_option('-f', '--frame', dest='frame', help='Poster frame (image file to be read)')
|
|
parser.add_option('-i', '--icon', dest='icon', help='Icon (image file to be written)')
|
|
(opts, args) = parser.parse_args()
|
|
if not opts.icon:
|
|
parser.print_help()
|
|
sys.exit()
|
|
|
|
iconSize = 1024
|
|
iconImage = Image.new('RGBA', (iconSize, iconSize))
|
|
|
|
if opts.frame:
|
|
frameImage = Image.open(opts.frame)
|
|
if frameImage.size[0] >= frameImage.size[1]:
|
|
frameWidth = int(frameImage.size[0] * iconSize / frameImage.size[1])
|
|
frameImage = frameImage.resize((frameWidth, iconSize), Image.ANTIALIAS)
|
|
crop = int((frameWidth - iconSize) / 2)
|
|
frameImage = frameImage.crop((crop, 0, crop + iconSize, iconSize))
|
|
else:
|
|
frameHeight = int(frameImage.size[1] * iconSize / frameImage.size[0])
|
|
frameImage = frameImage.resize((iconSize, frameHeight), Image.ANTIALIAS)
|
|
crop = int((frameHeight - iconSize) / 2)
|
|
frameImage = frameImage.crop((0, crop, iconSize, crop + iconSize))
|
|
iconImage.paste(frameImage, (0, 0, iconSize, iconSize))
|
|
else:
|
|
draw = ImageDraw.Draw(iconImage)
|
|
draw.polygon([(0, 0), (iconSize, 0), (iconSize, iconSize), (0, iconSize)], fill=(0, 0, 0))
|
|
for y in range(iconSize):
|
|
for x in range(iconSize):
|
|
if int((x + y + 192) / 128) % 2:
|
|
iconImage.putpixel((x, y), (32, 32, 32))
|
|
|
|
maskImage = Image.open(os.path.join(data_root, 'icon.mask.png'))
|
|
iconImage.putalpha(maskImage)
|
|
|
|
iconImage.save(opts.icon)
|
|
|
|
|