简单介绍:
- 项目需求:
- 项目思想和逻辑:
- 关键环境:
- 命令行测试:
- python pic.py -i ./obj_fie/file.png
- github:
code
import os
import argparse
from PIL import Image
parser = argparse.ArgumentParser()
parser.add_argument('-i', '--input', help="请输入要转换的图片文件路径,通过参数-i 或者 -input:")
parser.add_argument('-o', '--output', help="请输入字符画的路径,参数为-o 或者 -output:")
parser.add_argument('-w', '--width', type=int, default=80, help="可通过-w或者--width指定输出字符画的宽度,默认为80")
parser.add_argument('-hi', '--height', type=int, default=80, help="可通过-hi或者--height指定输出字符画的高度,默认为80")
args = parser.parse_args()
IMG = args.input
WIDTH = args.width
HEIGHT = args.height
OUTPUT = args.output
class TxTDraw(object):
"""
项目原理:
1、将所有像素都转换为字符
2、为了保证所有像素转换为字符,所以要将图片由三通道转换为单通道。
"""
def __init__(self):
self.STR_MAP = list("$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,\"^`'. ")
def get_char(self, r, g, b, alpha=256):
"""
将256灰度映射到70个字符上
:param r: r通道
:param g: g通道
:param b: b通道
:param alpha: 标记透明度的alpha通道
:return: 要写在文本中的字符
"""
if alpha == 0:
return ' '
gray = int(2126 * r + 7152 * g + 722 * b) / 10000
tmp_gray = 255 + 1
unit = tmp_gray / len(self.STR_MAP)
return self.STR_MAP[int(gray / unit)]
def draw_pic(self):
"""
将字符画画出
:return:字符画字符串
"""
img = Image.open(IMG)
img = img.resize((WIDTH, HEIGHT), Image.ANTIALIAS)
txt = ""
for i in range(HEIGHT):
for j in range(WIDTH):
txt += self.get_char(*img.getpixel((j, i)))
txt += '\n'
return txt
def write_output(self):
"""
将字符画字符串写入文件
:return:字符画字符串
"""
txt = self.draw_pic()
txt_name = os.path.basename(IMG)
with open(f"./obj_fie/{OUTPUT or txt_name.replace('.', '')+'.txt'}", 'w') as f:
f.write(txt)
return txt
if __name__ == '__main__':
obj = TxTDraw()
print(obj.write_output())
项目展示