python-pillow实现字符画

1.0 序言

  • 目标:使用python3 + pillow库完成图像(jpeg,png等)到字符画(txt)到转换并保存
  • 需要:对python,PIL模块,命令行工具argparse,和命令行界面(cmd/Terminal)的使用

1.1 介绍PIL、Pillow

PIL(Python Imaging Library)是Python图像处理库,PIL模块于2009年9月发布,最新版本是1.1.7,仅支持Python1.5.2 – 2.7
目前PIL项目已经停止开发,最后一次更新是在2011年

强调一下:PIL不支持Python3.x

Pillow也是Python的图像处理库,但Pillow是PIL特定版本Fork代码,Pillow兼容PIL绝大多数用法,开发活跃,更主要是Pillow库支持Python3.x,所以推荐使用Pillow

Python3.83.73.63.53.43.33.22.72.62.52.4
Pillow >= 7YesYesYesYes       
Pillow 6.2.1 – 6.2.2YesYesYesYes   Yes   
Pillow 6.0 – 6.2.0 YesYesYes   Yes   
Pillow 5.2 – 5.4 YesYesYesYes  Yes   
Pillow 5.0 – 5.1  YesYesYes  Yes   
Pillow 4  YesYesYesYes Yes   
Pillow 2 – 3   YesYesYesYesYesYes  
Pillow < 2       YesYesYesYes
python版本和对应的支持版本的pillow版本

现在网上说的PIL,一般都指Pillow,包括文章下面说的PIL,都是Pillow 模块

1.2 Pillow模块pip安装

python3 -m pip install --upgrade pip
python3 -m pip install --upgrade Pillow

无论是macOS还是Windows或是你特别有个性用着Linux都是命令行输入以上代码,如果是要下载制定版本的pillow就用这个:

python3 -m pip install --upgrade pip
python3 -m pip install Pillow==‘你要的版本号’

然后在再命令行进入python3,尝试import一下,如果没有报错就安装成功啦!

python3
import PIL 

#python3 环境下的PIL也就是pillow

2.1 实现原理

非常简单,直接上代码

2.2 代码解释

from PIL import Image
import argparse

import pillow库 和命令行工具(因为要经常调用所以用命令行

#命令行输入参数处理
parser = argparse.ArgumentParser()
 
parser.add_argument('file')     #输入文件
parser.add_argument('-o', '--output')   #输出文件
parser.add_argument('--width', type = int, default = 80) #输出字符画宽
parser.add_argument('--height', type = int, default = 80) #输出字符画高

先示例话命令行对象,再设置四个参数以调用时使用(‘-o’是optional的意思,可选选项)

#获取参数
args = parser.parse_args()
 
IMG = args.file
WIDTH = args.width
HEIGHT = args.height
OUTPUT = args.output

从srgs里读取刚刚写入的四个参数

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

用list()函数将所有需要的字符放入列表ascii_char

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)]

对于每个像素所要执行的操作——

所有颜色转换为256种灰度值 = gray

将每一个字符对应的所有灰度值中的几种灰度值范围计算出来 = unit

最后返回灰度值所对应的字符

主程序:

if __name__ == '__main__':
 
    im = Image.open(IMG)
    im = im.resize((WIDTH,HEIGHT), Image.NEAREST)

用pillow打开文件,储存为im,并将im resize为之前选定的长宽(就相当于每个像素对应一个字符

txt = ""
 
    for i in range(HEIGHT):
        for j in range(WIDTH):
            txt += get_char(*im.getpixel((j,i)))
        txt += '\n'
 
    print(txt)

定义一个文本变量,并对于每一行的每一个像素,在文本后添加相应的字符,结束一行后加一个’\n’换行,打印出来

if OUTPUT:
        with open(OUTPUT,'w') as f:#此处的‘w’是write的意思
            f.write(txt)
    else:
        with open("output.txt",'w') as f:
            f.write(txt)

如果之前你填写了OUTPUT这个选项选择输出文件名的话,保存成输入文件名,如果没有填,就用‘output.txt’输出

2.3 完整代码(复制专用

from PIL import Image
import argparse
 
#命令行输入参数处理
parser = argparse.ArgumentParser()
 
parser.add_argument('file')     #输入文件
parser.add_argument('-o', '--output')   #输出文件
parser.add_argument('--width', type = int, default = 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;:,\"^`'. ")
print(ascii_char)
# 将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)

关于 “python-pillow实现字符画” 的 1 个意见

发表评论

电子邮件地址不会被公开。 必填项已用*标注