跟着我来学一学pillow(用来处理图片的)
一. 认识pillow:
一个强大的处理图片的库,它支持图像的存储,显示和修改,目前流行的图片存储格式(“png”,“jpg”,"webp","gif"),它都支持,比如对图像进行裁剪,对图像的复制,对图像的保存,对图像的模式(“RGBA”,"RGB")的修改,还可以对图像进行压缩,它还可以强化图像的锐度,亮度,暗度等,总结起来两个功能是图像归档和图像处理。
二.安装pillow
pillow是第三方库,那么我们要安装下pillow:
pip install pillow
三. 导入pillow
from PIL import Image
四.使用pillow
我们先认识一下图像的读取和使用的方法:
| 方法 | 描述 |
| Image.open(filename) | 根据参数加载图像文件 |
| Image.new(mode,size,color) | 根据给定的参数创建一个新的图像 |
(1).我们用Image中的open属性读取图片,看一下效果吧。
from PIL import Image # 导入pillow中Image
img = Image.open('pika.jpg')
img.show() # 图片展示
运行代码如图:

(2).读取到图像了,img.size读取图像的宽和高
代码如下:
from PIL import Image # 导入pillow中Image
img = Image.open('pika.jpg')
# img.show() # 图片展示
width,height = img.size # 读取皮卡丘的宽和高
print(f"皮卡丘图像的宽是{width}px和高{height}px")
运行结果如图:

那么是否跟图像实际像素是否相符呢?

像素都一样,img.size能正确读取图像实际的宽和高。
(3).img.mode查看图像的模式,代码如下:
from PIL import Image # 导入pillow中Image
img = Image.open('pika.jpg')
# img.show() # 图片展示
width,height = img.size # 测量皮卡丘的宽和高
print(f"皮卡丘图像的宽是{width}px和高{height}px")
print(f"皮卡丘图像的mode是{img.mode}") # 查看图像的模式
代码运行如结果如图:

(4).用Image.new新建一个新图像,Image.new(mode,size,color)中的mode表示模式如(“RGB”,“RGBA”,"L"),size表示图像的宽和高,用元组形式表示(width,height),color表示填充的颜色,默认是黑色,可以指定填充颜色!!
①.填充颜色为默认,代码如下:
from PIL import Image
img = Image.new("RGB",(800,800))
img.show()
代码运行如下:

②.指定填充颜色:
from PIL import Image
img = Image.new("RGB",(800,800),color=(255,0,255)) # 指定颜色是粉红色
img.show()
代码运行结果如下:

(5).Image.convert 修改图像模式,Image.convert(mode)中的mode参数,有这些模式("L","表示灰度图"),("RGB","表示真彩色图像"),("CMYK","表示出版图像"),("RGBA","表示带透明的真彩色图像")等,先看看图像的原模式是啥,再修改成灰度图。
from PIL import Image
img = Image.open('mouse.jpg') # 图像原先是彩色
print(f"修改前img的模式为{img.mode}")
# 修改他的模式为L,并展示出出来
img2=img.convert("L")
print(f"修改后img的模式为{img2.mode}")
img2.show() # 修改后,成灰色
代码运行如下:


(6).Image.split()可以将图像的各颜色通道提取出来
from PIL import Image
img = Image.open('plant.webp')
r,g,b = img.split()
print(f"图像的r为{r}\n 图像的g为{g}\n 图像的b为{b}")
打印结果如下:
图像的r为<PIL.Image.Image image mode=L size=1034x840 at 0x12499287810>
图像的g为<PIL.Image.Image image mode=L size=1034x840 at 0x12499726110>
图像的 b为<PIL.Image.Image image mode=L size=1034x840 at 0x12499726850>
(7).Image.thumbnail()可以将图例进行压缩,Image.thumbnail(size)中的参数size表示将原图像压缩后的宽和高,用元组形式表示,代码如下:
from PIL import Image
img = Image.open('pika.jpg')
width,height = img.size
img.thumbnail((int(width/2),int(height/2)))
img.save('缩小版的皮卡丘.jpg')
(8).Image类的序列图像的操作方法:
| 方法 | 描述 |
| Image.seek(frame) | 跳转并返回图像的指定帧 |
| Image.tell() | 返回当前帧的序列 |
①.对下面这张GIF格式动态文件,提取其中的各帧图像,保存图像:

代码如下:
from PIL import Image
im = Image.open('./crazily_coding.gif')
try:
im.save('picframe{:02d}.png'.format(im.tell()))
while True:
im.seek(im.tell()+1)
im.save('picframe{:02d}.png'.format(im.tell()))
except:
print("处理结束")
代码运行如下,提取各帧图像如下:






(9).Image类图像的旋转和缩放
| 方法 | 描述 |
| Image.resize(size) | 按size大小调整图像,生成副本 |
| Image.rotate(angle) | 按angle角度旋转图像,生成副本 |
①.图像旋转45°,代码如下:
from PIL import Image
img = Image.open('pika.jpg')
img.rotate(45).show() # 旋转45°
代码运行结果如下:
②.将图像的宽和高调整到200px,代码如下:
from PIL import Image
img = Image.open('pika.jpg')
img.resize((200,200)).show() # 将图像的宽和高调整到200px
运行结果如下:

(10).Image类的图像像素和通道处理的方法
| 描述 | 方法 |
| Image.point(func) | 根据函数func的功能对每一个元素进行运算,返回图像副本 |
| Image.split() | 提取RGB图像的每个颜色通道,返回图像副本 |
| Image.merge(mode,bands) | 合并通道,其中mode表示色彩,bands表示新的色彩通道 |
| Image.blend(im1,im2,alpha) |
将两幅图片im1和im2按照如下公式插值后生成新图像: im1*(1.0-alpha)+im2*alpha |
①.提取RGB图像个颜色通道,调整颜色通道顺序,Image.merge()合并成新的图像,
from PIL import Image
im = Image.open('鸟巢.webp')
r, g, b = im.split()
om = Image.merge("RGB", (r, b, g)) # 交换g,b的位置
om.save("鸟巢2.webp")
新图像如下:

②.功能是:将G通道的颜色值变为原来的0.9倍,选择B通道值低于120的像素点,使用Image.point() 根据该功能进行计算,代码如下:
im = Image.open('鸟巢.webp')
r, g , b = im.split()
newg = g.point(lambda i: i*0.9) # 将G通道的颜色值变为原来的0.9倍
newb = b.point(lambda i: i < 120) # 选择B通道值低于120的像素点
om = Image.merge(im.mode,(newg,r,newb))
om.save("鸟巢3.webp")
效果如下:

③.Image.blend(image1,image2,alpha)用于修改混合透明度的大小,该alpha的取值范围是0-1,然后合并成新的图像,代码如下:
img1 = Image.open('./image/pandas.png')
img2 = Image.open('pika.jpg')
img2 = img2.resize(img1.size)
r,g,b = img1.split()
Image.blend(img2,img1,alpha=0.2).show() # 插值生成新的图像
(11).ImageFilter类的预定义过滤方法
| 方法表示 | 描述 |
| ImageFilter.BLUR | 图像的模糊效果 |
| ImageFilter.CONTOUR | 图像的轮廓效果 |
| ImageFilter.DETAL | 图像的细节效果 |
| ImageFilter.EDGE_ENHANCE | 图像的边界加强效果 |
| ImageFilter.EDGE_ENHANCE_MORE | 图像的阈值边界加强效果 |
| ImageFilter.EMBOSS | 图像的浮雕效果 |
| ImageFilter.FIND_EDGES | 图像的边界效果 |
| ImageFilter.SMOOTH | 图像的平滑效果 |
| ImageFilter.SMOOTH_MORE | 图像的阈值平滑效果 |
| ImageFilter.SHARPEN | 图像的锐化效果 |
①.试一下图像的轮廓效果
from PIL import ImageFilter,Image
im = Image.open('鸟巢.webp')
om = im.filter(ImageFilter.CONTOUR) # 图像过滤的方法
om.show()
代码运行结果如下:

②.试一下浮雕的效果,代码如下:
from PIL import ImageFilter,Image
im = Image.open('鸟巢.webp')
om = im.filter(ImageFilter.EMBOSS) # 浮雕过滤
om.show()
代码结果运行如下:

(12).ImageEnhance类的图像增强和滤镜的方法:
| 描述 | 描述 |
| ImageEnhance.enhance(factor) | 对选择属性的数值增强factor倍 |
| ImageEnhance.Color(im) | 调整图像的颜色平衡 |
| ImageEnhance.Contrast(im) | 调整图像的对比度 |
| ImageEnhance.Brightness(im) | 调整图像的亮度 |
| ImageEnhance.Sharpness(im) | 调整图像的锐度 |
①.强化一下图像的锐度,看看效果吧
from PIL import ImageEnhance,Image
im = Image.open('鸟巢.webp')
om = ImageEnhance.Sharpness(im) # 强化图像的锐度
om=om.enhance(20)
om.show()
代码运行如下:

②.强化一下亮度看看吧
from PIL import ImageEnhance
im = Image.open('鸟巢.webp')
om = ImageEnhance.Brightness(im).enhance(3) # 强化图像亮度
om.show()
代码运行如下:

③.像素色彩强化对比
from PIL import Image,ImageEnhance
img = Image.open('flower.png')
w,h = img.size # 获取img的宽和高
img_output = Image.new('RGB',(3*w,h))
img_output.paste(img,(0,0))
# 色彩强化
imgb = ImageEnhance.Color(img).enhance(1.5)
img_output.paste(imgb,(w,0))
imgc = ImageEnhance.Color(img).enhance(0.1)
img_output.paste(imgc,(2*w,0))
img_output.show()
代码运行结果如下:

(13).Image.composite(image1,image2,mask)该使用于图片的遮罩作用,两张图片的大小必须一致,才能作为遮罩与被遮罩
img1 = Image.open('plant.webp')
img2 = Image.open('pika.jpg')
img2 = img2.resize(img1.size)
r,g,b = img1.split() # 用于遮罩
Image.composite(img1,img2,b).show()
代码运行结果如下:

(14).Image.copy()是对图像进行一比一的复制,就是克隆出来的一样。
from PIL import Image
img = Image.open('plant.webp')
print(f"原图像的宽和高是{img.size}")
img2 = img.copy()
print(f"复制后,图像的宽和高是{img2.size}")
img2.show()
代码结果如下:


(15). Image.eval(img,function),该方法可以对图像进行各种逐像素的各种变换,比如,调整亮度、对比度等
①.调整亮度
img = Image.open('plant.webp')
img2 = img.copy()
print(img2.size)
Image.eval(img2,lambda i: i*2).show()
代码运行结果如下:

(16).Image.crop(box=None)该方法使用于裁剪图像,box是一个四元组,指的是上下左右四个区域的坐标
img1= Image.open('pika.jpg')
img2 = Image.open('mouse.jpg')
print("图像img1的宽和高",img1.size)
region = img1.crop((200,200,500,500)) # 剪切
print("图片img2的宽度和高度",img2.size)
img2.paste(region,(200,200)) # 粘贴
img2.show()
(17).Image.paste(image1,box=None,mask=None)该方法使用于粘贴图像,image1表示图源,mask表示遮罩,box主要分三种情况:
①.None:默认值,此时原图像将被粘贴到目标图像的左上角(0,0)的位置
②.(x,y):一个二元组,表示原图像在目标图像的左上角位置
③.(x,y,x2,y2):一个四元组,表示目标图像中一个矩形区域的左上角和右下角坐标,原图像将被调整大小来适应这一个大小区域。
mask:可选参数,用于指定一个遮罩图像。遮罩图像一般是一个单通道图像(通常是灰度图),其像素值表示粘贴时原图像每个像素的透明度,像素值为0表示完全透明,255表示完全不透明。
img1= Image.open('pika.jpg')
img2 = Image.open('mouse.jpg')
print("图像img1的宽和高",img1.size)
region = img1.crop((200,200,500,500)) # 剪切
print("图片img2的宽度和高度",img2.size)
img2.paste(region,(200,200)) # 粘贴
img2.show()
代码运行结果如下:

(18).Image.transpose()主要对于图像的进行翻转和旋转的各种操作
method 分下面几种状态:
①.Image.FLIP_LEFT_RIGHT:水平翻转图像,即左右镜像。
② .Image.FLIP_TOP_BOTTOM:垂直翻转图像,即上下镜像。
③. Image.ROTATE_90:将图像顺时针旋转 90 度。
④.Image.ROTATE_180:将图像顺时针旋转 180 度。
⑤ .Image.ROTATE_270:将图像顺时针旋转 270 度。
⑥. Image.TRANSPOSE:对图像进行转置操作,即交换图像的行和列。
from PIL import Image
img = Image.open('plant.webp')
print(img.mode)
# img.transpose(Image.FLIP_LEFT_RIGHT).show() # 左右
img.transpose(Image.FLIP_TOP_BOTTOM).show() # 上下
# img.transpose(Image.ROTATE_180).show() # 旋转180
# img.transpose(Image.ROTATE_270).show() # 旋转270
# img.transpose(Image.ROTATE_90).show() # 旋转90
# img.transpose(Image.TRANSPOSE).show() # 效果跟270度一样
代码运行如下:

(19).ImageDraw类图像绘制
| 表示方法 | 描述 |
| draw.line([x,y,x2,y2],fill=None,width=0,joint=None) | 表示绘制直线的方法,fill表示填充的颜色 |
| draw.arc([x,y,x2,y2],start,end,fill=None,width=0) |
表示绘制圆弧的方法,start表示起始角度, end表示结束角度,fill表示填充的颜色 |
| draw.elipse([x,y,x2,y2],fill=None,outline=None,width=0) | 表示绘制椭圆的方法,outline只规定圆的颜色 |
|
draw.chord([x,y,x2,y2],start,end,fill=None,outline=None, width=0) |
表示绘制弦的方法, |
| draw.pieslice([x,y,x2,y2],start,end,fill=None,outline=None,
width=0) |
表示绘制扇形的方法 |
| draw.polygon([x,y,x2,y2,......],fill=None,outline=None) | 表示绘制多边形的方法 |
| draw.rectangle([x,y,x2,y2],fill=None,outline=None,width=0)) | 表示绘制矩形的方法 |
|
draw.text(position,text,fill=None,font=None,anchor=None, spacing=0,align="left",direction=None,feature=None, language=None) |
表示绘制文本的方法,position表示文本的摆放位置,是一个二元组,direction表示文本的方向,spacing表示行之间的像素数 |
①.绘制图像和绘制文本超强体验!!!
from PIL import ImageDraw,ImageFont,Image
img = Image.new('RGB',(400,400))
draw_obj = ImageDraw.Draw(img)
draw_obj.rectangle((50,50,380,280),fill="white",outline="red")
font = ImageFont.truetype(f'C:/Windows/Fonts/SIMLI.TTF',30)
draw_obj.text((120,80),'啦啦',fill="cyan",font=font)
img.show()
代码运行结果如下:

②.绘制直线
img = Image.open('flower.png')
draw_a = ImageDraw.Draw(img)
w,h = img.size # 获取图像的宽和高
draw_a.line((0,0,w,h),fill=128,width=3) # 绘制正对角线
draw_a.line((0,h,w,0),fill=128,width=3) # 绘制反对角线
img.show()
代码运行结果如下:

(20).ImageChop类的像素合成的方法
| 表示方法 | 描述 |
| ImageChops.add(img,img2,scale=1.0,offset=0) |
通过如下公式进行加法运算out =((img+img2)/scale)+offset |
| ImageChops.subtract(img,img2,scale=1.0,offset=0) | 通过如下公式进行加法运算out =((img-img2)/scale)+offset |
| ImageChops.darker(img,img2) |
功能是比较两个图像的像素,取两张图片中对应像素的最小值,所以合成时两幅图片中对应位置的暗部分得到保留,去除亮的部分,根据如下公式: out = min(img,img2) |
| ImageChops.lighter(img,img2) | 功能是比较两个图片(逐像素比较),返回一幅新的图像,新的图像是将两张图像较亮的部分叠加得到。根据如下公式:out = max(img,img2) |
| ImageChops.multiply(img,img2) | 功能是将两张图片互相叠加,如果用纯黑色与某图片进行叠加操作,就会得到一幅纯黑色的图片。如果用纯白色与某图片进行叠加操作,则图片不受影响。根据如下公式:out = img*img2/MAX |
| ImageChops.difference(img,img2) | 功能是逐像素进行减法操作,计算出绝对值,能够找出两幅图像的对应像素值相减后的图像,对应值相投时,则为黑色 |
| ImageChops.invert(img) | 功能是类似于集合操作中的求补集,最大值为MAX,每个像素做减法,取出反色,在反色时将用255减去一幅图像的每个像素值,从而得到原来图像的反相。根据如下公式:out = MAX -img |
①.对比两张图像的差异:
from PIL import ImageChops,Image
img = Image.open('plant.webp')
img2 = Image.open('pika.jpg')
print(f"img模式为{img.mode}")
print(f"img2模式为{img2.mode}")
img2 = img2.resize(img.size)
img = img.convert('RGB')
# ImageChops.add(img2,img).show() # 加法
# ImageChops.subtract(img,img2).show() # 减法
# ImageChops.multiply(img,img2).show() # 叠加
# ImageChops.invert(img).show() # 反色
# ImageChops.darker(img,img2).show() # 变暗
# ImageChops.lighter(img2,img).show() # 变亮
ImageChops.difference(img,img2).show() # 差异
代码运行结果如下:

(21).ImageFont类图片文字方法
| 表示方法 | 描述 |
| ImageFont.load(path) |
从指定的文件中加载一种文字,该函数返回对应的字体对象。如果 该函数运行失败,那么将产生IOEORROR异常 |
| ImageFont.load_path(path) |
从指定的文件中加载一种文字,该函数返回对应的字体对象。如果 该函数运行失败,那么将产生IOEORROR异常,但是没有指定当前 路径,就会从文件sys.path开始查找指定的字体文件。 |
| ImageFont.load_default() | 加载默认的字体 |
| ImageFont.truetype(path,fontsize) | 加载TrueType或OpenType字体文件,并创建一个字体对象 |
|
ImageFont.getbbox(text,direction=None, features=None,language=None, stroke_width=0,anchor=None) |
获取给定文本在指定字体下的边界框信息。表示文本区域的左、上、右、下边界 |
| ImageFont.getlength(text, direction=None, features=None, language=None) |
计算给定文本在指定字体的长度即(宽度), 该方法在处理复杂字体排版时能准确的 反映文本实际占据的水平空间。 |
①.ImageFont.getbbox(text,direction=None,features=None,language=None,stroke_width=0,anchor=None)的参数说明:
text:需要计算尺寸的文本内容,通常为字符串类型
direction(可选):文本的书写方向,方向取值:‘rtl’(从右到左),'ltr'(从左到右),'ttb'(从上到下),默认为“None”
features(可选):OpenType字体特性列表,用于控制字体的特定排版效果,如小型大写字母,连写等,默认为“None”
language(可选):文本的语言代码,用于特定语言的排版规则,默认为“None”
stroke_width(可选):文本描边的宽度,默认为0.
anchor(可选):指定文本的锚点位置,用于确定文本的对齐方式,可以是字符串,如:‘lt’(左上),‘mm’(中间)等,默认为“None”
例子如下:
from PIL import Image,ImageDraw,ImageFont
font_path = r"C:/Windows/Fonts/simhei.ttf"
font_size = 30
font = ImageFont.truetype(font_path,font_size)
text = "Hello world!" # 需要计算尺寸的文本
bbox = font.getbbox(text)
left,top,right,bottom = bbox # 获取给定文本的左上右下的边界框的像素值
width = right-left
height = bottom-top # 计算文本的宽和高
print(f"文本的边界框的数值为{bbox}")
print(f"文本的宽{width}px和高为{height}px")
image = Image.new("RGB",(width+20,height+20),color=(255,255,255))
draw = ImageDraw.Draw(image)
draw.text((10-left,10-top),text,font=font,fill=(0,0,0))
draw.rectangle((10,10,10+width,10+height),outline=(255,0,0))
image.show()
运行结果如下:
文本的边界框的数值为(0, 3, 180, 26)
文本的宽180px和高为23px

②.ImageFont.getlength(text, direction=None, features=None, language=None)的参数说明:
text:需要计算尺寸的文本内容,通常为字符串类型
direction(可选):文本的书写方向,方向取值:‘rtl’(从右到左),'ltr'(从左到右),'ttb'(从上到下),默认为“None”
features(可选):OpenType字体特性列表,用于控制字体的特定排版效果,如小型大写字母,连写等,默认为“None”
language(可选):文本的语言代码,用于特定语言的排版规则,如“en”表示英语,默认为“None”
stroke_width(可选):文本描边的宽度,默认为0.
from PIL import Image,ImageDraw,ImageFont
image = Image.new('RGB',(400,200),color="white")
draw = ImageDraw.Draw(image)
font_path = r"C:/Windows/Fonts/arial.ttf"
font_size = 30
font = ImageFont.truetype(font_path,font_size)
text = "Hello,world!" # 代计算文本
text_length = font.getlength(text) # 计算文本的长度
print(f"文本{text}的长度{text_length}px")
draw.text((50,100),text,font=font,fill="black")
image.show()
代码运行结果如下:


(22).趣味例子
1.类似二维码的图像:
from PIL import Image,ImageDraw,ImageFont
import random
def get_color():
return (random.randint(200,255),random.randint(200,255),random.randint(200,255))
def get_char():
return chr(random.randint(65,97))
width,height = 300,300
img = Image.new('RGB',(width,height),(255,255,255))
draw = ImageDraw.Draw(img)
for x in range(width):
for y in range(height):
draw.point((x,y),fill=get_color())
font = ImageFont.truetype(r'C:/Windows/Fonts/SIMLI.TTF',30)
for i in range(4):
draw.text((100+20*i,200),get_char(),font=font,fill=(255,0,255))
draw.line((20,20,150,150),fill="green",width=5)
img.show()
代码运行结果为:

2.九宫格
from PIL import Image,ImageDraw,ImageFont
# 九宫格
def get_color(m,n):
a = m//100+n//100
if a == 0:
return (255,255,0)
elif a == 1:
return (0,255,255)
elif a == 2:
return (0,0,255)
elif a == 3:
return (0,255,0)
elif a == 4:
return (250,255,255)
else:
return (0,0,0)
width,height = 300,300
img = Image.new('RGB',(width,height),(255,255,255))
draw = ImageDraw.Draw(img)
for x in range(width):
for y in range(height):
draw.point((x,y),fill=get_color(x,y))
img.show()
代码运行结果如下:

3.将图像的黄色修改成红色
from PIL import Image,ImageDraw
def get_color(oldcolor):
# print(oldcolor)
if oldcolor[0] > 60 and oldcolor[1]>60: # r,b大于60像素包含黄色像素
return (oldcolor[0],0,oldcolor[2])
else:
return oldcolor
img = Image.open('bjsxt.png')
width,height = img.size
draw = ImageDraw.Draw(img)
for x in range(width):
for y in range(height):
oldcolor = img.getpixel((x,y))
draw.point((x,y),fill=get_color(oldcolor))
img.show()
代码运行结果如下:

4.读取图片,分解图片通道,再次合成图像
from PIL import Image, ImageDraw
import numpy as np
import os
import pickle
def image_to_arrayfile():
filenames = os.listdir(image_dir)
image_arrs = np.array([])
for filename in filenames:
img = Image.open(image_dir+filename)
# 将r,g,b,三个通道的提取
r,g,b = img.split()
r_arr = np.array(r).reshape(250000)
g_arr = np.array(g).reshape(-1)
b_arr = np.array(b).reshape(250000)
# r,g,b拼接成一个数组
arrs = np.concatenate((r_arr,g_arr,b_arr))
image_arrs=np.concatenate((arrs,image_arrs))
with open(array_file,'wb') as f:
pickle.dump(image_arrs,f)
def file_to_image():
with open(array_file,'rb') as f:
images = pickle.load(f)
image_arr = images.reshape((8,3,500,500))
for i in range(8):
r = Image.fromarray(image_arr[i][0]).convert('L')
g = Image.fromarray(image_arr[i][1]).convert('L')
b = Image.fromarray(image_arr[i][2]).convert('L')
image=Image.merge('RGB',(r,g,b))
image.save(result_dir+str(i)+'.png')
image_dir = './image/' # 图片地址
result_dir = './result/' # 保存图片地址
array_file = './array.bin'
if __name__ == "__main__":
image_to_arrayfile()
file_to_image()
代码结果如下:







5.做中文字符画
①.
from PIL import Image
ascii_char = list("$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjf1234567895t/\|()l{}[]?-_+~<>i!;:,\"^`'.")
def get_char(r,b,g,alpha=256):
if alpha == 0:
return ' '
gray = int(0.2126*r+0.7152*g+0.0722*b)
unit = 256 / len(ascii_char)
return ascii_char[int(gray//unit)]
def main():
im = Image.open('flower.png')
WIDTH,HEIGHT = 100,60
im = im.resize((WIDTH,HEIGHT))
txt = ""
for i in range(HEIGHT):
for j in range(WIDTH):
txt += get_char(*im.getpixel((j,i)))
txt += '\n'
fo = open('pic_char.txt','w',encoding="utf-8")
fo.write(txt)
fo.close()
main()
②.
from PIL import Image
def transform_text(image_file):
image_file = image_file.convert('L')
text = ''
width,height = image_file.size
for h in range(0,height):
for w in range(0,width):
gray = image_file.getpixel((w,h))
text = text + codeLib[int((count*gray)/256)]
text = text + '\r\n'
return text
im = Image.open('./image/pandas.jpg')
codeLib = '''@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,"^`'. '''
# im = im.resize((int(im.size[0]*0.5),int(im.size[1]*0.25)))
count = len(codeLib)
temp = open('pandas.txt',"w")
temp.write(transform_text(im))
temp.close()
打开后缀.txt文件时,注意字体需要改成“宋体”,字符才能跟图像相像
6.从数据库读取一张图片后,将其展示一下
import sqlite3
from PIL import Image
import io
f = open("crazily_coding.gif","rb")
img = f.read()
f.close()
db = sqlite3.connect("test3.db")
cursor = db.cursor()
sql = "update students set picture=? where name='李四'"
cursor.execute(sql,(img,))
db.commit()
sql = "select picture from students where name='李四'"
cursor.execute(sql)
data = cursor.fetchone()
image = Image.open(io.BytesIO(data[0]))
image.show()
cursor.close()
db.close()
结果如下:


更多推荐



所有评论(0)