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)
r,g,b = im.split() #分离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)
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帧内容
from PIL import ImageSequence #导入ImageSequence for frame in ImageSequence.Iterator(im): #使用迭代器 im.show() #显示各帧图片
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)
Pillow中最重要的类就是Image,该类存在于同名的模块中。能够经过如下几种方式实例化:从文件中读取图片,处理其余图片获得,或者直接建立一个图片。python
使用Image模块中的open函数打开一张图片:sql
from PIL import Image im = Image.open('1.gif') print(im) print(im.format,im.size,im.mode)
若是打开成功,返回一个Image对象,能够经过对象属性检查文件内容markdown
<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类的各个方法进行处理和操做图像,例如显示图片。app
im.show()
PS:标准版本的show()方法不是颇有效率,由于它先将图像保存为一个临时文件,而后使用查看器进行显示。ide
Pillow库支持至关多的图片格式。直接使用Image模块中的open()函数读取图片,而没必要先处理图片的格式,Pillow库自动根据文件决定格式。函数
Image模块中的save()函数能够保存图片,除非你指定文件格式,那么文件名中的扩展名用来指定文件格式。post
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。ui
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)
附件:原图