Gerando avatares padrão do Github

Neste artigo irei mostrar e dizer como você pode gerar avatares como no Github.





Resultado de geração para o apelido "test1"
Resultado de geração para o apelido "test1"

Primeiro você precisa entender como funciona o avatar do Github. À primeira vista, esta é apenas uma coleção aleatória de quadrados sombreados (doravante, blocos) em uma boa ordem em um fundo cinza.





Quantos quadrados há no avatar
Quantos quadrados há no avatar

Cada avatar tem 12 por 12 blocos.





Estacionamento automático aleatório nos espaços abertos do Github
Autarque aleatório dos espaços abertos do 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 {byte}
#   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()
      
      







Resultado

, - . , , , .





Vamos corrigir isso adicionando uma borda de blocos vazios.





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. Vamos agora dar uma olhada nos avatares gerados para outros apelidos.





test2
test2
test3
test3
test4
test4
test5
test5

E, finalmente, especialmente para Habr.





habr
habr
ufo
ufo

Isso é tudo. Agradeço a quem terminou a leitura e a quem quiser experimentar, mando para o meu repositório com todo o código.








All Articles