Pillow库的使用+图片转字符串

一、Pillow

PIL(Python Imaging Library)是一个 Python 图像处理库,Pillow 是一个对 PIL 友好的分支

1. 安装Pillow

pip install Pillow

如果下载失败或者超时,Linux下用国内镜像下载

pip  install --index https://pypi.mirrors.ustc.edu.cn/simple/ pillow 

2. Image类

PIL中最重要的是Image类,可以通过几种方法实例化:从文件中加载图像,处理其他图像得到,或者直接创建一个图像

2.1从文件中加载图像

使用open()函数加载图像,通过使用示例属性查看文件内容

from PIL import Image
im=Image.open("./2+2.jpg")
print(im.format, im.size, im.mode)

运行结果:

$ python test1.py
('JPEG', (954, 960), 'RGB')

format: 这个属性标识了图像来源。如果图像不是从文件读取它的值就是None

size:属性是一个二元tuple,包含width和height(宽度和高度,单位都是px)

mode 属性定义了图像bands的数量和名称,以及像素类型和深度。常见的modes 有 “L” (luminance) 表示灰度图像, “RGB” 表示真彩色图像, and “CMYK” 表示出版图像

如果文件打开错误,返回 IOError 错误

2.2对图像进行处理

2.2.1图像的裁剪

用PIL.Image.Image.crop方法获取图像一个子矩形区域

box = (0,0,500,500)
region = im.crop(box)
2.2.2图像的旋转

rotate(x): x需要顺时针旋转的角度

region = region.rotate(90) //顺时针旋转90°

在Pillow中,对于一些常见的旋转作了专门的定义:

region = region.transpose(Image.FLIP_LEFT_RIGHT)
region = region.transpose(Image.FLIP_TOP_BOTTOM)
region = region.transpose(Image.ROTATE_90)
region = region.transpose(Image.ROTATE_180)
region = region.transpose(Image.ROTATE_270)
2.2.3图像的粘贴合并

paste(now,old),粘贴矩形选区时候必须保持尺寸一致

im.paste(region, box)
2.2.4图像大小变换

resize((x,y))

im=im.resize((600,600))
2.2.5 颜色变换

convert(“L”) 彩色转化为黑白

convert(“CMYK”) 转化为出版彩色

im = im.convert("L")
im = im.convert("CMYK")

2.3 保存图片

save方法即可保存图片

综合上面图像处理方法的代码:

from PIL import Image
im=Image.open("./2+2.jpg") #打开图片
print(im.format, im.size, im.mode) #打印相关属性
box = (0,0,500,500) 
region = im.crop(box) #选取了一块500*500px的矩形选区
region = region.rotate(90) #选区顺时针旋转90°
im.paste(region, box) #粘贴到原图位置
im=im.resize((600,600)) #原图图片大小变为600*600
im = im.convert("L") #图片转化为灰色
print(im.format, im.size, im.mode) #打印相关属性
im.save("./2+2_new.jpg") #保存图片

运行结果

$ python test1.py
('JPEG', (954, 960), 'RGB')
(None, (600, 600), 'L')

之前图片:

这里写图片描述
之后图片:

这里写图片描述

二、图片转字符串

1.原理

用一个字符表现一种颜色,将彩色图(RGB)转换成灰度图,用著名心理学公式

Gray = R*0.299 + G*0.587 + B*0.114

灰度值:指黑白图像中点的颜色深度,范围一般从0到255,白色为255,黑色为0.

创建一个不重复的字符列表,灰度值小(暗)的用列表开头的符号,灰度值大(亮)的用列表末尾的符号

2.实现

#*- coding:utf-8 -*-

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;:,\"^`'. ")

# 将256灰度映射到70个字符上
def get_char(r,g,b,alpha = 256):
    if alpha == 0:
        return ' '
    length = len(ascii_char)
    gray = int(0.299 * r + 0.587 * g + 0.114 * 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 pic_to_str.py 2+2.jpg -o 2+2.txt
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$]_+$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$#+-(-_/$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$b~_[~(+_]$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$Q{-[~~~)v?+$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$x{+(~+^~~{/1+$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$1_)~~^^,+~[1)$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$$$$$$$[]}$$$j[{~~""^",_+?){$$$]}\$$$$$$$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$$$$$v[][]]$$m}}~~"""""<~j)U$$[[\]f$$$$$$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$$$$r[+>>?|}$$u{)~~^"^~<u(t$$}}>>?{\$$$$$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$$$?/_<>>>]x{$$u{\<<"~<n/x$$1{>>>!-//$$$$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$$~x+<>+"<>?r)$$n)j<<<cfx$${{>>!">i-f\$$$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$$1-<><,"^<<-n/$$u)j<nnu$$1)~<i"^"+i_(j$$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$u)>>~,^^^"<<-tt$$n(()c$$)(><+,^^":>>+(L$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$8(x>]^"^^"<~ufX$$((((($$j))<<"""",<<n|0$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$$a_n>~^""<<j]v$$|||\|(|$$j)]<<^""<<c)v$$@$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$w}$/a_n<<"><vnfu$\\\/$0\|($$-\t>>I>~vtuq$f}h$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$q{}}$/o-v~<<zux$p///|$$$J|\u_$(\x><<vxuq@f}f}o$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$w}zwt{$jh?v~Xcc$$tttt$$C$$0x-/$$/tn>zcYq$\{wwCtk$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$@{fqwqff$tatffc$$tffj_@jff$@]//t$$/tttUm$$1nqwqxf$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$@1fpqZf0$$jjjjt$$jjj$o?fjjt]$Ofj$$/tttt$$$c{ZwUfW$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$1{wjU$$rrrnrrr$$$$@j\qbq}j$$$$$tjftff/$$$n1uf&$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$@){J$$rrrn$#xxr$$$xrdkhqqvx$$@rjjd$vjjf$$@c1W$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$&$$xrrz$$$axnx$nnpk&!opqUx$jxrd$$$zjjf$$$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$@nrxY$$$$$annnubbMoonhpqXcnxd$$$$$cjjj$$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$nxrz$$$$$$$ouvbb+uohh#hqQzvq$$$$$$$zrrx$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$OxX$$$$$w$$$avvdb+bkbkpp0Xw$$$$$$$$$cxQ$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$$$$$$$$O$$@$$Bccdd]hbppwUZ$$$$%Z$$$$$$$$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$BccddtppwJq$$$$Z$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$BcUpppwLm$$$$Z$#$$$$$$$$$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$m$$$BzCpm0q$$$8$$a$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$$ccv*$$$$$$O$$$$$Bzzzm$$$$$0$$$ccb@$$$$$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$qcvvczu$$$$$$$$$$XXXXX$$$$$$$$$vvvcvz@$$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$@ccccvvvc$$$$$$$$YYYqXXX$$$$$$$$cccvvvc$$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$@$@cvvvvc$$$$$$XYY&$%XXX$$$$$$$$Wcvvvcv$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$$$$Bzvvvv$$$$$YYY&$$$BXXX$$$$$$$$$$vvvc8$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$$$$$$vvvv@$$$XYUM$$a$$%UYU$$$$$$$$$vvvcb$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$$$$$#cvcc$$$YYY&$$$f%$$BYUY$$$$$$$$vvvc$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$$$$@vcvc@$$$hYW$$$$f$@$$%Yp$$$$$$$$vvvv$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$$$$Cvvc%$$$$$$$$xwXnbLC$$$$$$$$$$$cvvz@$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$$$WvccB$@$$$$$$$(xczvvc$$$$$$$$$$Cvvc$$@$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$$#vvvvvvvz$$$$$$$$$z$$$$$$$$$$$@0vvccccc$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$Qcvvvvvvvz$$$$$$$$$z$$$$$$$$$$$ncvvvcccc$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$cccccvvvvvz$$$$$$$$$X$$$$$$$$$$zvvvvvvvvc@$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$@$$$$$$$$@$$$$$$$$$$$$$$$$$$$$$B@B@%88&km@$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
$$$$$$$$@@$$$$$$?$$$$$$@$$$$$$$&xZ$$$$$$$$$$$@$$$$@$$$@C$$$$$$@$$$$$J$$$$&$$$$$$
$$$$$$$$--$$$$$@-%$$$$?-_-+$$$-----c$$?-?--W$_-----@$$)-$$$$$_-_--$@_-@$??$$$$$$
$$$$$$$$-?$$$$$_--B$$$--@?-$$_-m$B-_$$--@r--@@$-?$@@$$--?$$$$-?$--$@]--?-?%$$$$$
$$$$$$$$-?$$$$q-M?-$$$-?]]B$@--$$$--$@--@]?B$$$-?$$$@??+-*$$$-?@-_$$$_--?$$$$$$$
$$$$$$$$-?$$$@--$--@$$-?8?-$@--$$$--@$--@-_$$$$-?$$$*??@--@$$-_]?&$$$@-?$$$$$$$$
$$$$$$$$-?B#$?-?----B$_?$--$@--k@)--$$--@--+$$$-?$$$--?---?$$-_$?-%$$$-?$$$$$$$$
$$$$$$$$----B--$$B_-C$?---a@$$-_--_@$$--$$--@$$-?@$]-_@$$--$$-_@#_[$$$??$$$$$$$$
$$$$$$$$$@@@$$J$$$B$$$@$$$$$$$$$%$$$$$$$$$$$$$$$$$$$$@$$$Y$$$$$$$8$$$$$$$$$$$$$$
$$$$$$$$$$$$$@@$$@$$$$$$$$$$$$$$$@$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值