├── .gitignore ├── demo_tornado.py ├── readme.md └── simple_avatar.py /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | 5 | # C extensions 6 | *.so 7 | 8 | # Distribution / packaging 9 | .Python 10 | env/ 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | eggs/ 15 | lib64/ 16 | parts/ 17 | sdist/ 18 | var/ 19 | *.egg-info/ 20 | .installed.cfg 21 | *.egg 22 | 23 | # Installer logs 24 | pip-log.txt 25 | pip-delete-this-directory.txt 26 | 27 | # Unit test / coverage reports 28 | htmlcov/ 29 | .tox/ 30 | .coverage 31 | .cache 32 | nosetests.xml 33 | coverage.xml 34 | 35 | # Translations 36 | *.mo 37 | *.pot 38 | 39 | # Django stuff: 40 | *.log 41 | 42 | # Sphinx documentation 43 | docs/_build/ 44 | 45 | .idea 46 | database.db 47 | .py~ 48 | .md~ 49 | .gitignore~ 50 | -------------------------------------------------------------------------------- /demo_tornado.py: -------------------------------------------------------------------------------- 1 | # coding:utf-8 2 | 3 | import sys 4 | import tornado.ioloop 5 | import tornado.web 6 | from simple_avatar import get_avatar_html 7 | 8 | py_ver = sys.version_info.major 9 | 10 | if py_ver == 3: 11 | unichr = chr 12 | 13 | tmpl = """ 14 | 15 | 16 | 17 | 46 | 47 | 48 |

49 | Demo 1 | 50 | Demo 2 51 |

52 |
53 | %s 54 |
55 | 56 | 57 | """ 58 | 59 | 60 | class MainHandler(tornado.web.RequestHandler): 61 | def get(self): 62 | self.redirect('/demo1') 63 | 64 | 65 | class DemoHandler1(tornado.web.RequestHandler): 66 | def get(self): 67 | self.write(tmpl % """ 68 | %s 69 | %s 70 | %s 71 | %s 72 | %s 73 | %s 74 |

75 | %s 76 | %s 77 | %s 78 | %s 79 | """ % (get_avatar_html('s', 48),get_avatar_html('i', 32),get_avatar_html('m', 32),get_avatar_html('p', 32),get_avatar_html('l', 32), get_avatar_html('e', 32), 80 | get_avatar_html('中', 56), get_avatar_html('文', 56), get_avatar_html('测中文测试', 56), get_avatar_html('试中文测试', 56) 81 | )) 82 | 83 | 84 | class DemoHandler2(tornado.web.RequestHandler): 85 | def get(self): 86 | lst = [] 87 | for i in range(1, 51): 88 | lst.append(get_avatar_html(str(i), 48, ecls=['avatar-box'])) 89 | for i in range(ord(u'一'), ord(u'一') + 50): 90 | lst.append(get_avatar_html(unichr(i), 48, ecls=['avatar-box'])) 91 | text = ' '.join(lst) 92 | 93 | self.write(tmpl % text) 94 | 95 | 96 | def make_app(): 97 | return tornado.web.Application([ 98 | (r"/", MainHandler), 99 | (r"/demo1", DemoHandler1), 100 | (r"/demo2", DemoHandler2), 101 | ], debug=True) 102 | 103 | if __name__ == "__main__": 104 | app = make_app() 105 | app.listen(8888) 106 | tornado.ioloop.IOLoop.current().start() 107 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | # Simple Avatar 2 | 3 | ![Simple Avatar](http://rpgame.net/pics/simple-avatar.png?v=2) 4 | 5 | Use first character to generate avatar. 6 | 7 | Tested on py2.7/py3.4 8 | 9 | ```python 10 | >>>> from simple_avatar import get_background_color, avatar_generate, get_avatar_html 11 | 12 | >>>> print(get_background_color('Test')) 13 | #0cbc66 14 | 15 | >>>> print(avatar_generate('Test', '#0cbc66', 32)) 16 |
T
17 | 18 | >>>> print(get_avatar_html('测试', 32)) 19 |
20 | 21 | ``` 22 | 23 | demo: 24 | 25 | ```bash 26 | python demo_tornado.py 27 | ``` 28 | -------------------------------------------------------------------------------- /simple_avatar.py: -------------------------------------------------------------------------------- 1 | # coding: utf-8 2 | 3 | """ 4 | CSS: 5 | .sa-avatar { 6 | color: white; 7 | text-align: center; 8 | display: inline-block; 9 | -ms-user-select:none; 10 | -moz-user-select:none; 11 | -webkit-user-select: none; 12 | font-family: "Helvetica Neue",Arial,"Hiragino Sans GB","Hiragino Sans GB W3","Microsoft YaHei","Wenquanyi Micro Hei",sans-serif; 13 | } 14 | """ 15 | 16 | import sys 17 | import hashlib 18 | 19 | py_ver = sys.version_info.major 20 | 21 | 22 | def get_background_color(txt): 23 | if py_ver == 3: 24 | return '#%s' % hashlib.md5(bytes(txt, 'utf-8')).hexdigest()[:6] 25 | else: 26 | # fix for py2 27 | if type(txt) == unicode: 28 | return '#%s' % hashlib.md5(txt.encode('utf-8')).hexdigest()[:6] 29 | else: 30 | return '#%s' % hashlib.md5(txt).hexdigest()[:6] 31 | 32 | 33 | def avatar_generate(txt, color, size, css_class='sa-avatar', ecls=None): 34 | """ 35 | :param txt: text for generate 36 | :param color: css color, like #abc 37 | :param size: integer, box size 38 | :param css_class: str, default css_class 39 | :param ecls: list, extra css classes 40 | :return: html of avatar 41 | """ 42 | 43 | params = { 44 | 'width': '%spx' % size, 45 | 'height': '%spx' % size, 46 | 'line-height': '%spx' % size, 47 | 'font-size': '%spx' % (size-10), 48 | 'background-color': color, 49 | } 50 | 51 | if py_ver == 3: 52 | char = txt[0] 53 | else: 54 | if type(txt) == str: 55 | char = txt.decode('utf-8')[0] 56 | else: 57 | char = txt[0] 58 | 59 | if ecls: 60 | css_classes = '%s %s' % (css_class, ' '.join(ecls)) 61 | else: 62 | css_classes = css_class 63 | 64 | return u"""
%s
"""\ 65 | % (css_classes, ';'.join('%s:%s' % x for x in params.items()), char.upper()) 66 | 67 | 68 | def get_avatar_html(txt, size, css_class='sa-avatar', ecls=None, color_func=get_background_color): 69 | return avatar_generate(txt, color_func(txt), size, css_class, ecls) 70 | 71 | 72 | if __name__ == '__main__': 73 | print(get_avatar_html('Test', 32)) 74 | print(get_avatar_html('测试', 64)) 75 | print(get_avatar_html('测试', 64, ecls=['test'])) 76 | --------------------------------------------------------------------------------