#!/usr/bin/python # -*- coding: utf-8 -*- # vi:si:et:sw=4:sts=4:ts=4 from __future__ import division import Image import ImageDraw from ox.image import drawText, wrapText def render_list_icon(options): icon_width = 256 icon_height = 256 icon_image = Image.new('RGBA', (icon_width, icon_height)) frame_height = icon_height / 4 frame_ratio = 4 / 3 frame_width = int(round(frame_height * frame_ratio)) for i, frame in enumerate(options['frames']): frame_image = Image.open(frame) frame_image_ratio = frame_image.size[0] / frame_image.size[1] frame_width_ = frame_width + (1 if i % 2 == 1 else 0) if frame_ratio < frame_image_ratio: frame_image = frame_image.resize((int(frame_height * frame_image_ratio), frame_height), Image.ANTIALIAS) left = int((frame_image.size[0] - frame_width_) / 2) frame_image = frame_image.crop((left, 0, left + frame_width_, frame_height)) else: frame_image = frame_image.resize((frame_width_, int(frame_width_ / frame_image_ratio)), Image.ANTIALIAS) top = int((frame_image.size[1] - frame_height) / 2) frame_image = frame_image.crop((0, top, frame_width_, top + frame_height)) icon_image.paste(frame_image, (i % 3 * frame_width + (1 if i % 2 == 2 else 0), int(i / 3) * frame_height)) mask_image = Image.open('icon.mask.png') mask_image = mask_image.resize((icon_width, icon_height)) icon_image.putalpha(mask_image) icon_image.save(options['icon']) def render_movie_icon(options): icon_width = 256 icon_height = 256 icon_image = Image.new('RGBA', (icon_width, icon_height)) frame_width = icon_width frame_ratio = 4 / 3 frame_height = int(round(frame_width / frame_ratio)) frame_image = Image.open(options['frame']) frame_image_ratio = frame_image.size[0] / frame_image.size[1] if frame_ratio < frame_image_ratio: frame_image = frame_image.resize((int(frame_height * frame_image_ratio), frame_height), Image.ANTIALIAS) left = int((frame_image.size[0] - frame_width) / 2) frame_image = frame_image.crop((left, 0, left + frame_width, frame_height)) else: frame_image = frame_image.resize((frame_width, int(frame_width / frame_image_ratio)), Image.ANTIALIAS) top = int((frame_image.size[1] - frame_height) / 2) frame_image = frame_image.crop((0, top, frame_width, top + frame_height)) icon_image.paste(frame_image, (0, 0)) timeline_image = Image.open(options['timeline']) timeline_image = timeline_image.resize((icon_width, 64), Image.ANTIALIAS) icon_image.paste(timeline_image, (0, icon_height - 64)) mask_image = Image.open('icon.mask.png') mask_image = mask_image.resize((icon_width, icon_height)) icon_image.putalpha(mask_image) icon_image.save(options['icon']) def render_oxdb_poster(options): def get_oxdb_color(oxdb_id, series=False): i = int(round((int(oxdb_id[2:10], 16) * 762 / pow(2, 32)))) if i < 127: color = (127, i, 0) elif i < 254: color = (254 - i, 127, 0) elif i < 381: color = (0, 127, i - 254) elif i < 508: color = (0, 508 - i, 127) elif i < 635: color = (i - 508, 0, 127) else: color = (127, 0, 762 - i) if series: color = tuple(map(lambda x: x + 128, color)) return color options['title'] = options['title'].decode('utf-8') options['director'] = options['director'].decode('utf-8') poster_width = 640 poster_height = 1024 poster_ratio = poster_width / poster_height poster_image = Image.new('RGB', (poster_width, poster_height)) draw = ImageDraw.Draw(poster_image) font_file = 'data/DejaVuSansCondensedBold.ttf' font_size = { 'small': 28, 'large': 42, } # frame if options['frame']: frame_width = poster_width frame_ratio = 4 / 3 frame_height = int(round(frame_width / frame_ratio)) frame_image = Image.open(options['frame']) frame_image_ratio = frame_image.size[0] / frame_image.size[1] if frame_ratio < frame_image_ratio: frame_image = frame_image.resize((int(frame_height * frame_image_ratio), frame_height), Image.ANTIALIAS) left = int((frame_image.size[0] - frame_width) / 2) frame_image = frame_image.crop((left, 0, left + frame_width, frame_height)) else: frame_image = frame_image.resize((frame_width, int(frame_width / frame_image_ratio)), Image.ANTIALIAS) top = int((frame_image.size[1] - frame_height) / 2) frame_image = frame_image.crop((0, top, frame_width, top + frame_height)) poster_image.paste(frame_image, (0, 0)) # timeline timeline_width = poster_width timeline_height = 64 timeline_image = Image.open(options['timeline']) timeline_image = timeline_image.resize((timeline_width, timeline_height), Image.ANTIALIAS) poster_image.paste(timeline_image, (0, frame_height)) # text text_width = poster_width text_height = poster_height - frame_height - timeline_height text_top = frame_height + timeline_height text_bottom = text_top + text_height text_margin = 16 text_color = get_oxdb_color(options['oxdb_id'], options['series']) font_color = tuple(map(lambda x: x - 128 if options['series'] else x + 128, text_color)) draw.rectangle([(0, text_top), (text_width, text_bottom)], fill=text_color) offset_top = text_top + text_margin if not options['director']: title_max_lines = 7 else: title_max_lines = min(len(wrapText(options['title'], text_width - 2 * text_margin, 0, font_file, font_size['large'])), 6) director_max_lines = 9 - int((title_max_lines * 3 - 1) / 2) if options['director']: lines = wrapText(options['director'], text_width - 2 * text_margin, director_max_lines, font_file, font_size['small']) for i, line in enumerate(lines): size = drawText(poster_image, (text_margin, offset_top), line, font_file, font_size['small'], font_color) offset_top += font_size['small'] + 2 offset_top += size[1] - font_size['small'] + text_margin / 2 lines = wrapText(options['title'], text_width - 2 * text_margin, title_max_lines, font_file, font_size['large']) for i, line in enumerate(lines): size = drawText(poster_image, (text_margin, offset_top + 5), line, font_file, font_size['large'], font_color) offset_top += font_size['large'] + 3 offset_top += size[1] - font_size['small'] + text_margin / 2 if options['year']: drawText(poster_image, (text_margin, offset_top), options['year'], font_file, font_size['small'], font_color) drawText(poster_image, (text_margin, text_bottom - text_margin - font_size['large'] + 2), options['oxdb_id'], font_file, font_size['large'], font_color) # logo logo_height = 32 logo_image = Image.open('data/logo.poster.png') logo_width = int(round(logo_height * logo_image.size[0] / logo_image.size[1])) logo_image = logo_image.resize((logo_width, logo_height), Image.ANTIALIAS) logo_left = text_width - text_margin - logo_width logo_top = text_bottom - text_margin - logo_height for y in range(logo_height): for x in range(logo_width): poster_color = poster_image.getpixel((logo_left + x, logo_top + y)) logo_color = logo_image.getpixel((x, y))[0] alpha = logo_image.getpixel((x, y))[3] if options['series']: poster_color = tuple(map(lambda x: x - (logo_color - 16) * alpha / 255, poster_color)) else: poster_color = tuple(map(lambda x: x + (logo_color - 16) * alpha / 255, poster_color)) poster_image.putpixel((logo_left + x, logo_top + y), poster_color) poster_image.save(options['poster']) def render_padma_poster(options): poster_width = 640 poster_height = 1024 poster_ratio = poster_width / poster_height poster_color = (255, 255, 0) poster_image = Image.new('RGB', (poster_width, poster_height)) font_file = 'data/DejaVuSansCondensedBold.ttf' font_size = 48 # timeline timeline_height = 64 timeline_lines = 16 timeline_image = Image.open(options['timeline']) timeline_image = timeline_image.resize((10240, timeline_height), Image.ANTIALIAS) for i in range(timeline_lines): line_image = timeline_image.crop((i * poster_width, 0, (i + 1) * poster_width, 64)) poster_image.paste(line_image, (0, i * timeline_height)) # id text = 'Pad.ma/' + options['id'] text_image = Image.new('RGB', (1, 1)) text_size = drawText(text_image, (0, 0), text, font_file, font_size, poster_color) text_width = poster_width text_height = timeline_height text_left = int((poster_width - text_width) / 2) text_top = 14 * timeline_height for y in range(text_top, text_top + text_height): for x in range(text_left, text_left + text_width): if y < text_top + 4 or y >= text_top + text_height - 4: poster_image.putpixel((x, y), poster_color) else: pixel = list(poster_image.getpixel((x, y))) for c in range(3): pixel[c] = (pixel[c] + poster_color[c]) / 4 poster_image.putpixel((x, y), tuple(pixel)) drawText(poster_image, ((poster_width - text_size[0]) / 2, text_top + (text_height - text_size[1]) / 2), text, font_file, font_size, poster_color) poster_image.save(options['poster'])