为了账号安全,请及时绑定邮箱和手机立即绑定

Python3:图片转字符画

标签:
Python


防伪码:没有相当程度的孤独是不可能有内心的平和。

1、环境准备

主机名 IP  系统  Python版本

Python-01   192.168.10.9    CentOS release 6.9 (Final)  3.5.4

参考:https://www.shiyanlou.com/courses/370/labs/1191/document

2、原理

字符画是一系列字符的组合,可以把字符看作是比较大块的像素,一个字符能表现一种颜色(暂且这么理解吧),字符的种类越多,可以表现的颜色也越多,图片也会更有层次感。

灰度值:指范围一般从0到255,白色为255,黑色为0,故黑白图片也称灰度图像。

任何颜色都由红、绿、蓝三基色组成,假如原来某点的颜色为RGB(R,G,B),本次实验可以用以下公式来转换灰度:

gray = 0.2126 * r + 0.7152 * g + 0.0722 * b

3、实验

本次实验的核心是pillow库的Image模块和argparse模块。

3.1 图像处理库pillow

Pillow是Python里的图像处理库,支持Python3.X,提供了广泛的文件格式支持和强大的图像处理能力,主要包括图像储存、图像显示、格式转换以及基本的图像处理操作等。

Image类使用说明参考:http://pillow.readthedocs.io/en/latest/reference/Image.html

3.2 安装pillow库

直接用Python3自带的pip安装即可:

pip install pillow

windows端可以用以下命令安装:

python3 -m pip install pillow

3.3 argparse模块

argparse模块使编写用户友好的命令行界面变得更容易。程序只需定义好它要求的参数,然后argparse将负责如何从sys.argv中解析出这些参数。argparse模块还会自动生成帮助和使用信息并且当用户赋给程序非法的参数时产生错误信息。

3.3.1 ArgumentParser对象

add_argument()方法必须知道期望的是可选参数,例如-o 或者--output参数用来设置输出文件:

parser = argparse.ArgumentParser()

parser.add_argument('-o', '--output')

add_argument()的default关键字参数,其默认值为None,指出如果命令行参数没有出现时它们应该是什么值,还可以设定其类型type,例如设定输出字符画的宽:

parser.add_argument('--width', type = int, default = 80)

3.4 准备图片

wKioL1mfj2mRI9J2AAB09TbRWOY101.jpg

3.5 源码

源码在Windows、CentOS和Ubuntu环境均验证成功。

vim test.py

#!/usr/bin/env python3

from PIL import Image

import argparse

# 命令行输入参数处理

parser = argparse.ArgumentParser()

parser.add_argument('file')     # 输入文件

parser.add_argument('-o', '--output')   # 输出文件

# 输出字符画宽,默认值为80

parser.add_argument('--width', type = int, default = 80)

# 输出字符画高,默认值为80

parser.add_argument('--height', type = int, default = 80) 

# 获取参数

args = parser.parse_args()

IMG = args.file

WIDTH = args.width

HEIGHT = args.height

OUTPUT = args.output

# 灰度值小(暗)的用列表开头的符号,灰度值大(亮)的用列表末尾的符号。

ascii_char = list("$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,\"^`'. ")

# 将256灰度映射到列表的70个字符上

def get_char(r,g,b,alpha = 256):

    if alpha == 0:

        return ' '

    length = len(ascii_char)

    gray = int(0.2126 * r + 0.7152 * g + 0.0722 * b)

    unit = (256.0 + 1)/length

    return ascii_char[int(gray/unit)]

if __name__ == '__main__':

    im = Image.open(IMG)

    im = im.resize((WIDTH,HEIGHT), Image.NEAREST)

    txt = ""

    for i in range(HEIGHT):

        for j in range(WIDTH):

            txt += get_char(*im.getpixel((j,i)))

        txt += '\n'

    print(txt)

    # 字符画输出到文件

    if OUTPUT:

        with open(OUTPUT,'w') as f:

            f.write(txt)

    else:

        with open("output.txt",'w') as f:

            f.write(txt)

3.6 运行结果

python3 test.py timg.jpg

                                      ....  ..

                           ......lB&],,,,,,,+Mp'...

                            ..8c,,,,,,,,,,,,,,,,M"`

                        . '&<,,,,,,,,,,,,,,,,,,,,,!U .

                       '+aI,,,,,,,,,,,,,,,,,,,,,,,,;|f.'

                      'ox:,,,,,,,,,,,,,,,,,,,,,,,,,,,">o\..

                     o",:,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"::c@.

                  . &:"I,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,f^,,lJ.

                  ^>";,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,M,,,`&

                .';",&,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"!",,,:}.

                ^,,,:,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#l,,,":]

               '",,,,^,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,;!,,,,,Ix..

              ',,,,,m,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,M!,,,,,,Z`

             'Z,,,,,M,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,l!,,,,,,^.`

           ..h:,,,,"*,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,ii:,,,,,,}.

            ti,,,,,:[,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,k!,,,,,,,M

           .I,,,,,,,:",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,&!,,,,,,,,v

           k,,,,,,,l:,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,_!:,,,,,,,"'

          Y:,,,,,,,!:,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,l!l,,,,,,,:#

         '[,,,,,,,,l:",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,ii!,,,,,,,:0

       . o^,,,,,,,!l:,,,,,",,",,,,,,,,,,,,,,,,,,":lz(,,,",,;]!:,,,,,,,0&

       .`O,,,,,,,:!!",,,j**WWMW[,,,,,,,,,,,,,,,vMMMWMM8o,,,,{!;,,,,,,,0Z.

       .80,,,,,,,:!l:,,,8,,""":",,,,,,,,,,,,,,,M",:,:::I,,,,(!!,,,,,,"0QW

      .`00",,,,,:!l{,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,^?>!,,,,,,,00Q..

     .'W00",,,,,:!1*:",,,,::,,,,,,,,,,,",,,,,,,,,,,,,,,,,,,,^^!",,,,,"00Ou

     ..000",,,,,!I\JjmW;,",,,,,,,,,,,,-8^,,,,,,,,,,,,,,:,,&&,.`p;,,,,"000a.

      %000,,,,,,!)[nxxn*;:,,,,,,,,,,,,^,,,,,,,,,,,,,,,:Izunu#..'8I,,,"000O^

     .0000:,,,,;>}Mxxxxx8:,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0rxxxj`   #l,,"0000B

     M0000,,,,,!1vnnxxxx\:,,,,,,,,,,,,,,,,,,,,,,,,,,,,,vxxxxr@    ';",0000k

    .O0000I,,,!(bWxxxxxxf:,,,,,,,,,,,,:"",,,,,,,,,,,,:Ixxxxxxx'    'W,00000

    .00000},,;>a'uxxxxxx%",,,,,,,,,,,"%ujM;:,,,,,,,,,,/xxxxxxxW    . M00000,

    W00000n,,ip :xxxxxnt:,,,,!W:,,^#Mxnxxnn%C&M8WW;,,,"jxxxxunQ      ."q000o.

    000000J,-' .#xrxxxm;",,,,:;",:,"Mxxxnxv^:",":,",,,,Wnxxxv::&+    .`'800Z'

   !000000Qo ..#,,"8W^,,,,,,,,,,,,,,,Mnnxu8,,,,,,,,,,,,,,&hxB,,,,#''   . #0OJ

  .M0000QQ# .Wl,,,:o",,,,,,,,,,,,,,,,:&nx/;,,,,,,,,,,,,,,,,:<,,,,,J'       *M.

  `O000L*.. .,,,,,,;",,,,,,,,,,,,,,,,,,z*^,,,,,,,,,,,,,,,,,,M,,,,,,&.      .#.

  BQ00&`   .m,,,,,:Z,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,IZ,,,,,:.

  B#M..     :,,,,^#!:,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,!:J,,,,,!.

           .",,,,;^ul!:,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,":i)Cl,,,,l!.

        .  `>,,,,,":Yfi!!;,,,,,,,,,,,,,,,,,,,,,,,,,,::I!I8X!I,,,,,l!.

            ;!,,,,,,":{#WIl!!!!!I;:,""",::;IIl!i!!llf&&{11!;,,,,,!!r'

            Ll!,,,,,,:,"?(t]jq8&MWWWM&&&&&##M8*X1)(1()1ll!,,,,,,I!!f

             *l!:,,,,,,,,:"::l!<_+-][{{{11{{11{[_!:!!l!:,",,,,,:l!X.

             "B!!!;,,,,,,,,,,,,,","",,,,",,,",,,:,,",:,,,,:,,:!!!a..

            .. *l!!!!",,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,!!!!i*.      .

                v!!!!!:,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,li>!o

                .<*i!!,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,l;` .

                  .jJI,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,!-

                    `I,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,!!

                    .I,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,:! .

                    W!,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,id

                  ..~!,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,!#.

                   .I!,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,!!

                  .+!,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,:i

                   %!,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,iX

                   _!,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,!%

                  .I;,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,"I

                  '!,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,i..

                  Y!,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,!;.

                 'M!,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,0.

                . ?;,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,#.

                ..I:,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,:8.

                 .l,,,,,,,,,,,,,,,,,::::::::::::::::::::::::,!&.

                  -,,,,,,,,,,,,,,,,::::::::::::::::::::::::::lh.

                . #,,,,,,,,,,,,,,,,:::::::;:::;;:::;:::::::::l1.

                   ,,,,,,,,,,,,,,,,::::;;;;;;;;;:;;;;;;;;;;;!<

                  .*I::,,,,,,,,,,,,,,,;:;:;;;;;;;;;;;;;;;;;;:M

                    #~!;,:,,,,,:,:li!!!!li!!!!!!!!!;;;;;;;;;_

                     1M;>l>!!!ill!!!}##&W#W&&1>l>l!!!!!!I;Ik .

                    (>~((fk#oaC|)|))))))))))))(\(#oMC1<ao#xW

                    aC<!i!!!((((()()))))))))))))(()(\\)){)<!

                    \~+!!!i(())))))))))))))))))))))))(i!!!!&Q.

                    (aa!!@))()))))))))))())))))))))()){I!!M!!

                     ;|["'            .               )/&lt\

                       ...                            . .;..

当然,也可以调整默认参数,来缩小输出比例:

python3 test_img.py  --width 30 --height 30 timg.jpg

wKiom1mf0XOROQaiAABBW4hfoi0557.png-wh_50

4、总结

熟悉了argparse模块和Image模块。argparse是Python用于解析命令行参数和选项的标准模块,举例:

import argparse

parser = argparse.ArgumentParser()

parser.add_argument("echo")

args = parser.parse_args()

print args.echo

$ python xx.py test1

test1

©著作权归作者所有:来自51CTO博客作者达日来的原创作品,如需转载,请注明出处,否则将追究法律责任


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消