pillow教程

2018/08/06 21:32
阅读数 3.7K
导入
from PIL import Image
打开图片
#方式一:
im = Image.open('1.jpg')
#方式二
f = open('1.jpg','rb')
im = Image.open(f)
#从tar压缩文件打开
from PIL import TarIO
fp = TarIO.TarIO('2.tar','1.jpg')  #压缩文件名   图片名
im = Image.open(fp)
查看格式
im.format
查看大小
im.size
查看模式
im.mode
查看文件名
im.filename
查看位数
im.bits
显示图片
im.show()
保存图片
im.save('1.bmp')
查看高度
im.height
查看宽度
im.width
缩略图
size = (500,500)    #缩略图大小
im.thumbnail(size)  #原图的相似图,宽高中较大值为500
复制图片
tn = im.copy()
截取图片
box = (100,100,400,400)  #定义截取的左上右下边界
region = im.crop(box)  #一种懒方法,可用load提前执行
旋转图片
region = region.transpose(Image.ROTATE_180)#顺时针旋转180°
out = im.rotate(45) #将图片逆时针旋转45°
粘贴图片
im = im.paste(region, box)
分离RGB
r,g,b = im.split()   #分离RGB通道
合成RGB
im = Image.merge("RGB",(g,r,b))  #用RGB通道合成新图
更改大小
size = (500,500)    #图片大小设定
out = im.resize(size)
置换图片
out = im.transpose(Image.FLIP_LEFT_RIGHT)  #0
out = im.transpose(Image.FLIP_TOP_BOTTOM)  #1
out = im.transpose(Image.ROTATE_90)        #2
out = im.transpose(Image.ROTATE_180)       #3
out = im.transpose(Image.ROTATE_270)       #4
out = im.transpose(Image.TRANSPOSE)        #5
模式转换
out = im.convert('L')        #将图片转换成黑白图
使用滤镜
from PIL import ImageFilter     #导入滤镜模块
out = im.filter(ImageFilter.DETAIL)
point操作
out = im.point(lambda i:i*1.5)
图片增强
from PIL import ImageEnhance    #导入图片增强模块
enh = ImageEnhance.Contrast(im)    
enh.enhance(1.3).show("30% more contrast")  #对比度增加30%
动态图片
im = Image.open('2.gif')     #打开一张动态图片,默认第0帧
im.n_frames                #查看动态图帧数
im.tell()                  #当前帧数
im.seek(i)                  #查找第i帧
im.show()                  #显示第i帧内容
 使用ImageSequence
from PIL import ImageSequence     #导入ImageSequence
for frame in ImageSequence.Iterator(im):    #使用迭代器
    im.show()               #显示各帧图片
 获取Bands
im.getbands()
 
将图片左右置换
from PIL import Image
import os, sys

def roll(image, delta):
 "Roll an image sideways"
 xsize, ysize = image.size
 delta = delta % xsize
 if delta == 0:
 return image
 part1 = image.crop((0, 0, delta, ysize))
 part2 = image.crop((delta, 0, xsize, ysize))
 part1.load()
 part2.load()
 image.paste(part2, (0, 0, xsize-delta, ysize))
 image.paste(part1, (xsize-delta, 0, xsize, ysize))
 return image


if __name__ == '__main__':
 im = Image.open(sys.argv[1])
 im.show()
 delta = int(sys.argv[2])
 re = roll(im, delta)
 re.show()
常见模式
• 1 (1-bit pixels, black and white, stored with one pixel per byte)
• L (8-bit pixels, black and white)
• P (8-bit pixels, mapped to any other mode using a color palette)
• RGB (3x8-bit pixels, true color)
• RGBA (4x8-bit pixels, true color with transparency mask)
• CMYK (4x8-bit pixels, color separation)
• YCbCr (3x8-bit pixels, color video format)
– Note that this refers to the JPEG, and not the ITU-R BT.2020, standard
• LAB (3x8-bit pixels, the L*a*b color space)
• HSV (3x8-bit pixels, Hue, Saturation, Value color space)
• I (32-bit signed integer pixels)
• F (32-bit floating point pixels)







Image类

Pillow中最重要的类就是Image,该类存在于同名的模块中。可以通过以下几种方式实例化:从文件中读取图片,处理其他图片得到,或者直接创建一个图片。

使用Image模块中的open函数打开一张图片:

from PIL import Image

im = Image.open('1.gif')
print(im)
print(im.format,im.size,im.mode)

 

如果打开成功,返回一个Image对象,可以通过对象属性检查文件内容

<PIL.GifImagePlugin.GifImageFile image mode=P size=170x288 at 0x567748> GIF (170, 288) P
  • format属性定义了图像的格式,如果图像不是从文件打开的,那么该属性值为None;
  • size属性是一个tuple,表示图像的宽和高(单位为像素);
  • mode属性为表示图像的模式. 
    模式属性如下:
1 1位像素,黑和白,存成8位的像素
L 8位像素,黑白
P 8位像素,使用调色板映射到任何其他模式
RGB 3×8位像素,真彩
RGBA 4×8位像素,真彩+透明通道
CMYK 4×8位像素,颜色隔离
YCbCr 3×8位像素,彩色视频格式
I 32位整型像素
F 32位浮点型像素

当有一个Image对象时,可以用Image类的各个方法进行处理和操作图像,例如显示图片。

im.show()

PS:标准版本的show()方法不是很有效率,因为它先将图像保存为一个临时文件,然后使用查看器进行显示。

读写图片

Pillow库支持相当多的图片格式。直接使用Image模块中的open()函数读取图片,而不必先处理图片的格式,Pillow库自动根据文件决定格式。

Image模块中的save()函数可以保存图片,除非你指定文件格式,那么文件名中的扩展名用来指定文件格式。

im = Image.open('1.gif')
im.save('f.BMP')

通常,save用以保存一个临时的image对象到硬盘。而转换工作由一个功能更为强大的convert()方法来完成。

拷贝,粘贴,合并图片

from PIL import Image

im = Image.open('tu.jpg')
#设置要拷贝的区域  
box = (100, 100, 500, 500) # 将im表示的图片对象拷贝到region中,大小为(400*400)像素。 # 这个region可以用来后续的操作(region其实就是一个Image对象), # box变量是一个四元组(左,上,右,下)。 region = im.crop(box) # 从字面上就可以看出,先把region中的Image反转180度,然后再放回到region中。 region = region.transpose(Image.ROTATE_90) #粘贴box大小的region到原先的图片对象中。 im.paste(region, box) im.save('1.jpg')

 

这里写图片描述

区域由4-tuple决定,该tuple中信息为(left, upper, right, lower),Pillow左边系统的原点(0,0)为图片的左上角。坐标中的数字单位为像素点。 
上面示例粘贴后的图片是临时性,需要save保存成新图片。

box = im.copy() #直接复制图像

分离和合并通道

每一个RGB都是由三个通道的灰度图叠加的,所以pil提供了将这三个通道分离的方法. 
对于单通道图片,split()返回图像本身。为了处理单通道图片,必须先将图片转成RGB。

r,g,b = im.split()#分割成三个通道  
im = Image.merge("RGB", (b, g, r))  #将b,r两个通道进行翻转。 im.save('rgb.jpg')

这里写图片描述

几何转变

Image类有resize()、rotate()和transpose()、transform()方法进行几何变换,用以重定义图片大小,对图片进行旋转等操作。 
简单几何变换:

out = im.resize( ( 128,128))
out = im.rotate(45)

这里写图片描述 
置换图像:

# 左右翻转
out = im.transpose(Image.FLIP_LEFT_RIGHT)
# 上下反向 out = im.transpose(Image.FLIP_TOP_BOTTOM) out = im.transpose(Image.ROTATE_90)

 

transpose()和象的rotate()没有性能差别。 
这里写图片描述

模式转换

# 黑白
am = im.convert('L')
am.show()

图像增强

1.滤镜 
ImageFilter模块提供了很多预定义的图片加强滤镜。 
比如一个常用的滤镜,细节(detail滤镜)

from PIL import ImageFilter  

im = Image.open('tu.jpg')
out = im.filter(ImageFilter.DETAIL)  

2.直接操作像素点 
可以对每个像素点进行操作,而且,每一个通道都可以独立的进行操作。比如,将每个像素点的亮度(不知道有没有更专业的词)增大20%

#注意这里用到一个匿名函数(那个可以把i的1.2倍返回的函数)  
out = im.point(lambda i : i *  1.2)

3.读写图片的更多方式 
通常,我们使用open方法进行图片的打开操作。但是这不是唯一的方式。完全可以跟python的IO整合起来。

fp = open("tu.jpg", "rb")  
im = Image.open(fp)  

附件:原图 
这里写图片描述

 
 

图片加上文字

from PIL import Image,ImageDraw,ImageFont

im = Image.open('tu.jpg')
draw = ImageDraw.Draw(im)

(width, height) = im.size
myfont  = ImageFont.truetype('yuanqi.ttf',size = 120) fillcolor = 'pink' #第一个参数是加入字体的坐标 #第二个参数是文字内容 #第三个参数是字体格式 #第四个参数是字体颜色 draw.text( (60,100) , u'萌萌哒' ,font = myfont , fill = fillcolor ) im.save('tu_word.jpg')

这里写图片描述

图片加上数字

from PIL import Image,ImageDraw,ImageFont

im = Image.open('tu.jpg')
draw = ImageDraw.Draw(im)

(width, height) = im.size
myfont  = ImageFont.truetype('yuanqi.ttf',size = 120) #在图上画一个圆,ellipse参数分别为 左上角的坐标,右下角的坐标 #ellipse(左上X , 左上Y , 右下X , 右下Y) draw.ellipse((width-200, 0 ,width,200),fill="red",outline="red") draw.text((width-120,20 ),'5',font=myfont,fill='white') im.save('tu_number.jpg')

 

这里写图片描述

将图片转化成字符画

#coding:utf-8
from PIL import Image

#要索引的字符列表
ascii_char = list("$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,\"^`'. ") length = len(ascii_char) #读取图像文件 def readImg(): img = Image.open('kai.png') (width,height) = img.size img = img.resize( ( int(width * 0.9) , int(height * 0.5) )) print(img.size) return img def convert(img): # 转为灰度图像 img = img.convert('L') txt = '' for y in range(img.size[1]): for x in range(img.size[0]): # 获取每个坐标像素点的灰度 gray = img.getpixel((x,y)) unit = 256.0 / length txt += ascii_char[(int)(gray/unit)] txt += '\n' return txt if __name__ == '__main__': txt = convert(readImg()) with open('kai.txt','w') as f: f.write(txt)

 

原图: 
这里写图片描述

字符: 
这里写图片描述

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部