dynamic.py 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. import os
  2. from PIL import Image, ImageColor, ImageDraw, ImageFont
  3. from django.utils.module_loading import import_string
  4. from misago.conf import settings
  5. from . import store
  6. COLOR_WHEEL = (
  7. '#d32f2f', '#c2185b', '#7b1fa2', '#512da8', '#303f9f', '#1976d2', '#0288D1', '#0288d1',
  8. '#0097a7', '#00796b', '#388e3c', '#689f38', '#afb42b', '#fbc02d', '#ffa000', '#f57c00',
  9. '#e64a19',
  10. )
  11. COLOR_WHEEL_LEN = len(COLOR_WHEEL)
  12. FONT_FILE = os.path.join(os.path.dirname(__file__), 'font.ttf')
  13. def set_avatar(user):
  14. drawer_function = import_string(settings.MISAGO_DYNAMIC_AVATAR_DRAWER)
  15. image = drawer_function(user)
  16. store.store_new_avatar(user, image)
  17. def draw_default(user):
  18. """default avatar drawer that draws username's first letter on color"""
  19. image_size = max(settings.MISAGO_AVATARS_SIZES)
  20. image = Image.new("RGBA", (image_size, image_size), 0)
  21. image = draw_avatar_bg(user, image)
  22. image = draw_avatar_flavour(user, image)
  23. return image
  24. def draw_avatar_bg(user, image):
  25. image_size = image.size
  26. color_index = user.pk - COLOR_WHEEL_LEN * (user.pk // COLOR_WHEEL_LEN)
  27. main_color = COLOR_WHEEL[color_index]
  28. rgb = ImageColor.getrgb(main_color)
  29. bg_drawer = ImageDraw.Draw(image)
  30. bg_drawer.rectangle([(0, 0), image_size], rgb)
  31. return image
  32. def draw_avatar_flavour(user, image):
  33. string = user.username[0]
  34. image_size = image.size[0]
  35. size = int(image_size * 0.7)
  36. font = ImageFont.truetype(FONT_FILE, size=size)
  37. text_size = font.getsize(string)
  38. text_pos = ((image_size - text_size[0]) / 2, (image_size - text_size[1]) / 2, )
  39. writer = ImageDraw.Draw(image)
  40. writer.text(text_pos, string, font=font)
  41. return image