python:实现通过字符串将图片画出来

简单介绍:
  • 项目需求:
    • 将传入的图片使用字符串保存并展示。
  • 项目思想和逻辑:
    • 代码中很容易看明白
  • 关键环境:
    • python 3.65 Pillow 7.0.0
  • 命令行测试:
    • python pic.py -i ./obj_fie/file.png
  • github:
code
#!/usr/local/bin/python3
# -*- coding: utf-8 -*-
# Author  : rusi_

import os
import argparse

from PIL import Image

# 参数flag
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 ' '
        # 灰度值公式将像素的 RGB 值映射到灰度值,灰度值范围为 0-255。
        # 整型慢计算比浮点数块(其数值代表权重值,意为人眼对rgb的敏感强度)
        # gray = int(0.2126 * r + 0.7152 * g + 0.0722 * b)
        gray = int(2126 * r + 7152 * g + 722 * b) / 10000

        # 字符集只有,70的映射操作。
        tmp_gray = 255 + 1  # 灰度值范围为 0-255即最大为255,又因为int的退一法操作,所以再加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)
        # 如果OUTPUT有值就用OUTPUT,没有就用txt_name.replace('.', '')+'.txt'。
        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())

# im.getpixel()以元祖的形式返回32位4通道对应的数值。
# im.resize()重设图片大小,Image.ANTIALIAS :图片质量(此处为最高质量)

项目展示项目展示
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值