Générer des avatars Github par défaut

Dans cet article, je vais vous montrer et vous dire comment générer des avatars comme sur Github.





Résultat de génération pour le pseudo "test1"
Résultat de génération pour le pseudo "test1"

Vous devez d'abord comprendre comment fonctionne l'avatar Github. À première vue, il ne s'agit que d'une collection aléatoire de carrés ombrés (ci-après, blocs) dans un bon ordre sur un fond gris.





Combien de carrés y a-t-il dans l'avatar
Combien de carrés y a-t-il dans l'avatar

Chaque avatar a 12 par 12 blocs.





Autark aléatoire des espaces ouverts de Github
Autark aléatoire des espaces ouverts de Github

, , , 6 12, , 12 12.





, , . python.









from PIL import ImageDraw, Image
import numpy as np
import hashlib
      
      







background_color = '#f2f1f2'
s = 'test1'
      
      



   . - , , .





bytes = hashlib.md5(s.encode('utf-8')).digest()
      
      



   





main_color = bytes[:3]
main_color = tuple(channel // 2 + 128 for channel in main_color) # rgb
      
      



   , . 6 12, , :





6 \ cdot 12 \ cdot 1 \ text {bit} = 72 \ text {bit} = 9 \ text {octet}
#   6  12
need_color = np.array([bit == '1' for byte in bytes[3:3+9for bit in bin(byte)[2:].zfill(8)]).reshape(612)

#   12  12     
need_color = np.concatenate((need_color, need_color[::-1]), axis=0)
      
      



    





img_size = (avatar_size, avatar_size)
block_size = avatar_size // 12 #  

img = Image.new('RGB', img_size, background_color)
draw = ImageDraw.Draw(img)

for x in range(avatar_size):
    for y in range(avatar_size):
        need_to_paint = need_color[x // block_size, y // block_size]
        if need_to_paint:
            draw.point((x, y), main_color)
      
      



,





img.show()
      
      







Résultat

, - . , , , .





Corrigeons cela en ajoutant une bordure de blocs vides.





for i in range(12):
    need_color[0, i] = 0
    need_color[11, i] = 0
    need_color[i, 0] = 0
    need_color[i, 11] = 0
      
      



Voila. Jetons maintenant un œil aux avatars générés pour les autres surnoms.





test2
test2
test3
test3
test4
test4
test5
test5

Et enfin, surtout pour Habr.





habr
habr
OVNI
OVNI

C'est tout. Merci à ceux qui ont fini de lire, et à ceux qui veulent expérimenter, j'envoie à mon référentiel avec tout le code.








All Articles