dynamic.py 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. import math
  2. import os
  3. from importlib import import_module
  4. from PIL import Image, ImageColor, ImageDraw, ImageFilter, ImageFont
  5. from misago.conf import settings
  6. from . import store
  7. def set_avatar(user):
  8. name_bits = settings.MISAGO_DYNAMIC_AVATAR_DRAWER.split('.')
  9. drawer_module = '.'.join(name_bits[:-1])
  10. drawer_module = import_module(drawer_module)
  11. drawer_function = getattr(drawer_module, name_bits[-1])
  12. image = drawer_function(user)
  13. store.store_new_avatar(user, image)
  14. """
  15. Default drawer
  16. """
  17. def draw_default(user):
  18. image_size = max(settings.MISAGO_AVATARS_SIZES)
  19. image = Image.new("RGBA", (image_size, image_size), 0)
  20. image = draw_avatar_bg(user, image)
  21. image = draw_avatar_flavour(user, image)
  22. return image
  23. COLOR_WHEEL = ('#d32f2f', '#c2185b', '#7b1fa2', '#512da8',
  24. '#303f9f', '#1976d2', '#0288D1', '#0288d1',
  25. '#0097a7', '#00796b', '#388e3c', '#689f38',
  26. '#afb42b', '#fbc02d', '#ffa000', '#f57c00',
  27. '#e64a19')
  28. COLOR_WHEEL_LEN = len(COLOR_WHEEL)
  29. def draw_avatar_bg(user, image):
  30. image_size = image.size
  31. color_index = user.pk - COLOR_WHEEL_LEN * (user.pk / COLOR_WHEEL_LEN)
  32. main_color = COLOR_WHEEL[color_index]
  33. rgb = ImageColor.getrgb(main_color)
  34. bg_drawer = ImageDraw.Draw(image)
  35. bg_drawer.rectangle([(0, 0), image_size], rgb)
  36. return image
  37. FONT_FILE = os.path.join(os.path.dirname(__file__), 'font.ttf')
  38. def draw_avatar_flavour(user, image):
  39. string = user.username[0]
  40. image_size = image.size[0]
  41. size = int(image_size * 0.7)
  42. font = ImageFont.truetype(FONT_FILE, size=size)
  43. text_size = font.getsize(string)
  44. text_pos = ((image_size - text_size[0]) / 2,
  45. (image_size - text_size[1]) / 2)
  46. writer = ImageDraw.Draw(image)
  47. writer.text(text_pos, string, font=font)
  48. return image
  49. """
  50. Some utils for drawring avatar programmatically
  51. """
  52. CHARS = 'qwertyuiopasdfghjklzxcvbnm1234567890'
  53. def string_to_int(string):
  54. value = 0
  55. for p, c in enumerate(string.lower()):
  56. value += p * (CHARS.find(c))
  57. return value