Разработка на коленке

"тут должна быть красивая цитата о программировании"

Избавился от Marker With Label

2014-09-04 19:50

Из-за проблем с производительностью пришлось выбросить из проекта эту библиотеку. Теперь для отображения количества точек используется заранее сгенерированный spritesheet, в котором иконки с надписями. И скорость работы повысилась, и ушёл один плавающий баг. В общем, чем проще, тем лучше.

А spritesheet сгенерировал скриптом на питоне, который выглядит примерно так:

import math

from os import path
from PIL import ImageFont, Image, ImageDraw


def here(*pathchunks):
    return path.abspath(path.join(path.dirname(__file__), *pathchunks))


def spritesheet(image, labels, columns):
    original_width, original_height = image.size

    font_name = '/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf'
    font = ImageFont.truetype(font_name, 10)

    sheet_items = []
    for label in labels:
        item_image = image.copy()

        item_draw = ImageDraw.Draw(item_image)

        _, text_height = item_draw.textsize(label)
        text_width, _ = font.getsize(label)

        item_draw.text(
            ((original_width - text_width) / 2, (original_height - text_height) / 2),
            label, (255, 255, 255), font=font)

        sheet_items.append(item_image)

    sheet_width = original_width * columns
    lines = int(math.ceil(len(labels) / float(columns)))
    sheet_height = original_height * lines
    sheet = Image.new(mode='RGBA', size=(sheet_width, sheet_height), color=(0, 0, 0, 0))

    for number, item_image in enumerate(sheet_items):
        x = number % columns
        y = int(number / columns)
        sheet.paste(item_image, (x * original_width, y * original_height))

    sheet.save(here('sheet.png'), 'PNG')


if __name__ == '__main__':
    spritesheet(
        Image.open(here('image.png')), [str(i) for i in range(25)], 10
    )