程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长

+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

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

发布于2020-02-26 11:37     阅读(783)     评论(0)     点赞(28)     收藏(1)


简单介绍:

  • 项目需求:
    • 将传入的图片使用字符串保存并展示。
  • 项目思想和逻辑:
    • 代码中很容易看明白
  • 关键环境:
    • 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 :图片质量(此处为最高质量)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94

项目展示项目展示

发布了67 篇原创文章 · 获赞 3 · 访问量 4727


所属网站分类: 技术文章 > 博客

作者:听爸爸的话

链接:https://www.pythonheidong.com/blog/article/234015/44b8a7a53d8f74945584/

来源:python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

28 0
收藏该文
已收藏

评论内容:(最多支持255个字符)