123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 |
- from importlib import import_module
- import math
- import os
- from PIL import Image, ImageDraw, ImageColor, ImageFont, ImageFilter
- from misago.conf import settings
- from misago.users.avatars import store
- def set_avatar(user):
- name_bits = settings.MISAGO_DYNAMIC_AVATAR_DRAWER.split('.')
- drawer_module = '.'.join(name_bits[:-1])
- drawer_module = import_module(drawer_module)
- drawer_function = getattr(drawer_module, name_bits[-1])
- image = drawer_function(user)
- store.store_new_avatar(user, image)
- """
- Default drawer
- """
- def draw_default(user):
- image_size = max(settings.MISAGO_AVATARS_SIZES)
- image = Image.new("RGBA", (image_size, image_size), 0)
- image = draw_avatar_bg(user, image)
- image = draw_avatar_flavour(user, image)
- return image
- COLOR_WHEEL = ('#1abc9c', '#2ecc71', '#3498db', '#9b59b6',
- '#f1c40f', '#e67e22', '#e74c3c')
- COLOR_WHEEL_LEN = len(COLOR_WHEEL)
- def draw_avatar_bg(user, image):
- image_size = image.size
- color_index = user.pk - COLOR_WHEEL_LEN * (user.pk / COLOR_WHEEL_LEN)
- main_color = COLOR_WHEEL[color_index]
- rgb = ImageColor.getrgb(main_color)
- bg_drawer = ImageDraw.Draw(image)
- bg_drawer.rectangle([(0, 0), image_size], rgb)
- image_steps = 3
- step_size = math.ceil(float(image_size[0]) / image_steps)
- for x in xrange(image_steps):
- x_step = float(x + 2) / image_steps
- for y in xrange(image_steps):
- y_step = float(y + 2) / image_steps
- bit_rgb = (int(c * (1 - (x_step * y_step) / 5)) for c in rgb)
- bit_pos = (x * step_size, y * step_size)
- bit_size = (x * step_size + step_size, y * step_size + step_size)
- bg_drawer.rectangle([bit_pos, bit_size], tuple(bit_rgb))
- image = image.filter(ImageFilter.SHARPEN)
- return image
- FONT_FILE = os.path.join(os.path.dirname(__file__), 'font.ttf')
- def draw_avatar_flavour(user, image):
- string = user.username[0]
- image_size = image.size[0]
- max_string_size = image_size
- size = int(max_string_size)
- font = ImageFont.truetype(FONT_FILE, size=size)
- #while max(font.getsize(string)) > max_string_size:
- # size -= 1
- # font = ImageFont.truetype(FONT_FILE, size=size)
- text_size = font.getsize(string)
- text_pos = ((image_size - text_size[0]) / 2,
- (image_size - text_size[1]) / 2)
- writer = ImageDraw.Draw(image)
- writer.text(text_pos, string, font=font)
- return image
- """
- Some utils for drawring avatar programmatically
- """
- CHARS = 'qwertyuiopasdfghjklzxcvbnm1234567890'
- def string_to_int(string):
- value = 0
- for p, c in enumerate(string.lower()):
- value += p * (CHARS.find(c))
- return value
|