デフォルトのGithubアバターを生成する

この記事では、Githubのようにアバターを生成する方法を紹介します。





ニックネーム「test1」の生成結果
ニックネーム「test1」の生成結果

まず、Githubアバターがどのように機能するかを理解する必要があります。一見すると、これは灰色の背景に適切な順序で影付きの正方形(以下、ブロック)をランダムに集めたものです。





アバターにはいくつの正方形がありますか
アバターにはいくつの正方形がありますか

各アバターには12x12のブロックがあります。





Githubのオープンスペースからのランダムなautark
Githubのオープンスペースからのランダムなautark

, , , 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()
      
      







結果

, - . , , , .





空のブロックの境界線を追加して、これを修正しましょう。





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
      
      



出来上がり。次に、生成された他のニックネームのアバターを見てみましょう。





test2
test2
test3
test3
test4
test4
test5
test5

そして最後に、特にHabrにとって。





habr
habr
ufo
ufo

それで全部です。読み終えた人と実験したい人のおかげで、私はすべてのコードとともに私のリポジトリに送信します。








All Articles