├── .github └── dependabot.yml ├── .gitignore ├── LICENSE ├── README.md ├── pic2ascii.py └── setup.py /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | - package-ecosystem: pip 4 | directory: "/" 5 | schedule: 6 | interval: daily 7 | time: "21:00" 8 | open-pull-requests-limit: 10 9 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.pyc 2 | __pycache__/ 3 | venv/ 4 | .Python 5 | .cache/ 6 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2019 An Long 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of 6 | this software and associated documentation files (the "Software"), to deal in 7 | the Software without restriction, including without limitation the rights to 8 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 9 | the Software, and to permit persons to whom the Software is furnished to do so, 10 | subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 17 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 18 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 19 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 20 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # pic2ascii.py 2 | 3 | ## Installation 4 | 5 | ```sh 6 | pip install pic2ascii 7 | ``` 8 | 9 | ## Usage 10 | 11 | Using in as command line tool: 12 | 13 | ```bash 14 | $ python -m pic2ascii --help 15 | 16 | Usage: pic2ascii.py FILENAME 17 | optional flags: --reverse | --width | --height | --chars 18 | ``` 19 | 20 | Using as python module: 21 | 22 | ```python 23 | from pic2ascii import pic2ascii 24 | 25 | pic2ascii("input file name") 26 | ``` 27 | 28 | ### Sample 29 | 30 | Input from https://twitter.com/HoDaRaKe/status/1731659623357100417, output: 31 | 32 |
33 | MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM0;coodxdoo;lMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
34 | MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM0;ol:k0l:dclMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
35 | MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM0;lkkkkkOx;lMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
36 | MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM0;lkkkkkkxccMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
37 | MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMx;lkkddxkdc;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
38 | MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM0kO0KMMMMMMx;cddlloxo;;MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
39 | MMMMMMMMMMMMMMMMMMMMMMMMMMMMN0xddc;::;0XMMMMk;lxxddxxdccMMMMMMMMMMMMNKKXWMMMMMMMMMMMMMMMMMMMMMMMMMMM
40 | MMMMMMMMMMMMMMMMMMMMMMMMMM0lldkO000OOkdlllxOo;lddccodoccMMMMMMMMMMKllkOxcoNMMMMMMMMMMMMMMMMMMMMMMMMM
41 | MMMMMMMMMMMMMMMMMMMMMMMMMd;xXXKKKKXKKXXKKOkxl;coollool;cWMMMMMMMM0;oMMMMMl;XMMMMMMMMMMMMMMMMMMMMMMMM
42 | MMMMMMMMMMMMMMMMMMMMMMMMX;oMXKKKKKKKKKKKKXMMx;cllcccllc;XMMMMMMM0;lMMMMMMX;lMMMMMMMMMMMMMMMMMMMMMMMM
43 | MMMMMMMMMMMMMMMMMMMMMMMMK;oMXKKKKKKKKKKKNMMMo;;;;cc;c;c;kMMMMMNx;xMMMMMMMW;lMMMMMMMMMMMMMMMMMMMMMMMM
44 | MMMMMMMMMMMMMMMMMMMMMMMMWccMMKKKKKKKKKKWMMMMo;;;;;;;;;;;codkxooxNMMMMMMMM0;xMMMMMMMMMMMMMMMMMMMMMMMM
45 | MMMMMMMMMMMMMMMMMMMMMMMMMk:xMWKKKKKKKKNMMMMMOlclllllclloWMWWWMMMMMMMMMMMMccNMMMMMMMMMMMMMMMMMMMMMMMM
46 | MMMMMMMMMMMMMMMMMMMMMMMMMMd:kMNKKKKKKXMMMMMMWxxxxxxxxxdOMMMMMMMMMMMMMMMMl;KMMMMMMMMMMMMMMMMMMMMMMMMM
47 | MMMMMMMMMMMMMMMMMMMMMMMMMMMd:OMNKKKKKWMMMMMMXxxxxxxxxxxkMMMMMMMMMMMMMMMl;0MMMMMMMMMMMMMMMMMMMMMMMMMM
48 | MMMMMMMMMMMMMMMMMMMMMMMMMMMMo:KMXKKKKMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMd;0MMMMMMMMMMMMMMMMMMMMMMMMMMM
49 | MMMMMMMMMMMMMMMMMMMMMMMMMMMMN;lMNKKKXMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMK;dMMMMMMMMMMMMMMMMMMMMMMMMMMMM
50 | MMMMMMMMMMMMMMMMMMMMMMMMMMMMMl;WNKKKXMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMk;kMMMMMMMMMMMMMMMMMMMMMMMMMMMM
51 | MMMMMMMMMMMMMMMMMMMMMMMMMMMM0;oNXKKKXMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMN;lMMMMMMMMMMMMMMMMMMMMMMMMMMMM
52 | MMMMMMMMMMMMMMMMMMMMMMMMMMMK;lKXKKKKKWMMMMMMMMMMMMMMMMMMMMMMMMMMN0O0NMK:oMMMMMMMMMMMMMMMMMMMMMMMMMMM
53 | MMMMMMMMMMMMMMMMMMMMMMMMMMk;oKXKKKKKKKXNNNolddddxxxxxxxdllXMNNKl;k0x;oM0;cXMMMMMMMMMMMMMMMMMMMMMMMMM
54 | MMMMMMMMMMMMMMMMMMMMMMMMMd;xXXKKKKKKKKKKKKc;dlcldxOKNWMMl:KMKKx:oMMMo:KMOc:0MMMMMMMMMMMMMMMMMMMMMMMM
55 | MMMMMMMMMMMMMMMMMMMMMMMWo;kXXKKKKKKKKKKKKKc;KN0Oxolc;ccxl;KMKXx;o0oKo;KMX0l:kMMMMMMMMMMMMMMMMMMMMMMM
56 | MMMMMMMMMMMMMMMMMMMMMMWlc0XKKKKKKKKKKKKKKKc;XMMMMMMMWXKNl;KMKXx;oMWMo;KMKKKo:xMMMMMMMMMMMMMMMMMMMMMM
57 | MMMMMMMMMMMMMMMMMMMMMMl;0NKKKKKKKKKKKKKKKKc;XMMMMMMMMMMMo;KMKXx;cOkOc;KMKKKKl:OMMMMMMMMMMMMMMMMMMMMM
58 | MMMMMMMMMMMMMMMMMMMMMx;kNKKKKKKKKKKKKKKKKKc;kXXXXXXXXXXXl;KMKXx::,,:;;KMKKKK0c;NMMMMMMMMMMMMMMMMMMMM
59 | MMMMMMMMMMMMMMMMMMMMN;lWXKKKKKKKKKKKKKKKKKl;;:;;;;;;;;;;;;kNKXx;lX0Kl;KMKKKKXx:oMMMMMMMMMMMMMMMMMMMM
60 | MMMMMMMMMMMMMMMMMMMMO:kMKKKKKKKKKKKKKKKKKKK000000000000000KKKXx;oMMMo;KMKKKKK0c;MMMMMMMMMMMMMMMMMMMM
61 | MMMMMMMMMMMMMMMMMMMMk:0MKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKXx;ckxkc;KMKKKKKKc;NMMMMMMMMMMMMMMMMMMM
62 | MMMMMMMMMMMMMMMMMMMMO;xMXKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKXx:;:,:;;KWKKKKK0;cMMMMMMMMMMMMMMMMMMMM
63 | MMMMMMMMMMMMMMMMMMMMWccWMXKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKXk;;xOx;c0XKKKKXd;xMMMMMMMMMMMMMMMMMMMM
64 | MMMMMMMMMMMMMMMMMMMMMXccNMNKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKOdooodOXKKKXKd;oMMMMMMMMMMMMMMMMMMMMM
65 | MMMMMMMMMMMMMMMMMMMMMMNo;kMMWXKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKXKKKXKKKXKOlckMMMMMMMMMMMMMMMMMMMMMM
66 | MMMMMMMMMMMMMMMMMMMMMMMMKdcdKWMMWNXXKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKXXXXK0xlcxWMMMMMMMMMMMMMMMMMMMMMMM
67 | MMMMMMMMMMMMMMMMMMMMMMMMMMW0dooxOKXNWWWWWNWWWNNNWWWWWWNNWNNNNNNNXK0OxdookXMMMMMMMMMMMMMMMMMMMMMMMMMM
68 | MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMWX0kxddddddddxxxxdoooodxxxxddddddddxkOKNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
69 | MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMNolllkMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
70 | MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
71 | MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
72 | MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
73 | 
74 | -------------------------------------------------------------------------------- /pic2ascii.py: -------------------------------------------------------------------------------- 1 | from typing import Tuple 2 | 3 | import fire 4 | from PIL import Image 5 | 6 | 7 | WIDTH = 80 8 | CHARS = " ...',:;clodxkO0KXNWMMMM" 9 | 10 | 11 | def pic2ascii( 12 | filename: str, *, reverse: bool = False, width=WIDTH, height=0, chars=CHARS 13 | ): 14 | chars = CHARS 15 | if reverse: 16 | chars = list(reversed(chars)) 17 | output = "" 18 | image = Image.open(filename) 19 | size = getsize(image, width, height) 20 | image = image.resize(size) 21 | image = image.convert("L") 22 | pixs = image.load() 23 | for y in range(size[1]): 24 | for x in range(size[0]): 25 | output += chars[int(pixs[x, y] / 10)] 26 | output += "\n" 27 | print(output) 28 | 29 | 30 | def getsize(image: Image.Image, width: int, height: int) -> Tuple[int, int]: 31 | """Calculate the target picture size""" 32 | s_width = image.size[0] 33 | s_height = image.size[1] 34 | t_width = width 35 | t_height = height 36 | if not t_height: 37 | t_height = (s_height * t_width) / s_width 38 | t_height = int(t_height * 0.4) 39 | t_size = (t_width, t_height) 40 | return t_size 41 | 42 | 43 | if __name__ == "__main__": 44 | fire.Fire(pic2ascii) 45 | -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | from os import path 2 | from setuptools import setup, find_packages 3 | 4 | 5 | this_directory = path.abspath(path.dirname(__file__)) 6 | with open(path.join(this_directory, 'README.md'), encoding='utf-8') as f: 7 | long_description = f.read() 8 | 9 | 10 | setup( 11 | name='pic2ascii', 12 | version='0.2.0', 13 | 14 | description='A simple tool to draw yout image to ascii code', 15 | long_description=long_description, 16 | long_description_content_type='text/markdown', 17 | 18 | url='https://github.com/aisk/pic2ascii', 19 | author='asaka', 20 | author_email='aisk1988@gmail.com', 21 | 22 | license='MIT', 23 | 24 | classifiers=[ 25 | 'Development Status :: 4 - Beta', 26 | 'License :: OSI Approved :: MIT License', 27 | 28 | 'Programming Language :: Python :: 3.5', 29 | ], 30 | 31 | keywords='image to ascii', 32 | packages=find_packages(exclude=['tests']), 33 | install_requires=[ 34 | 'pillow>=8,<12', 35 | 'fire~=0.3', 36 | ], 37 | ) 38 | --------------------------------------------------------------------------------