一. 安装
PIL仅支持到Python 2.7,Pillow支持最新Python 3.x,又加入了许多新特性,如果安装了Anaconda,Pillow就已经可用了。我用的的是python3.6,本来是可以通过pip install Pillow 命令安装的,但是我的总是会出错,没办法,我只能先把Pillow-5.2.0-cp36-cp36m-win_amd64.whl下载下来,在cmd下将目录改到改下载文件的目录,然后执行pip install Pillow-5.2.0-cp36-cp36m-win_amd64.whl,成功了
二. 使用教程
使用Image类
Python Imaging Library中最重要的类是
Image
类,它在模块中定义,具有相同的名称。可以通过多种方式创建此类的实例; 通过从文件加载图像,处理其他图像或从头开始创建图像。要从文件加载图像,请使用模块中的open()方法
>>> from PIL import Image >>> im = Image.open("hopper.ppm")如果成功,则此函数返回一个
Image
对象。现在可以使用实例属性来检查文件内容:>>> from __future__ import print_function >>> print(im.format, im.size, im.mode) PPM (512, 512) RGB该
format
属性标识图像的来源。如果未从文件中读取图像,则将其设置为“无”。size属性是一个包含宽度和高度(以像素为单位)的2元组。该mode
属性定义图像中波段的数量和名称,以及像素类型和深度。常见模式是灰度图像的“L”(亮度),真彩色图像的“RGB”和印前图像的“CMYK”。如果无法打开该文件,
IOError
则会引发异常。获得
Image
类的实例后,可以使用此类定义的方法来处理和操作图像。例如,让我们显示刚刚加载的图像:>>> im.show()注意
标准版本
show()
效率不高,因为它将图像保存到临时文件并调用 xv实用程序来显示图像。如果你没有安装xv ,它甚至都不会工作。当它工作时,它非常方便调试和测试。以下部分概述了此库中提供的不同功能。
读写图像
Python Imaging Library支持各种图像文件格式。要从磁盘读取文件,使用模块中的open()方法。您无需知道打开文件的文件格式。库根据文件内容自动确定格式。
要保存文件,请使用该类的
save()
方法 。保存文件时,名称变得很重要。除非指定格式,否则库使用文件扩展名来发现要使用的文件存储格式。将文件转换为
from __future__ import print_function import os, sys from PIL import Image for infile in sys.argv[1:]: f, e = os.path.splitext(infile) outfile = f + ".jpg" if infile != outfile: try: Image.open(infile).save(outfile) except IOError: print("cannot convert", infile)可以向
save()
明确指定文件格式的方法提供第二个参数。如果使用非标准扩展,则必须始终以这种方式指定格式:创建JPEG缩略图
from __future__ import print_function import os, sys from PIL import Image size = (128, 128) for infile in sys.argv[1:]: outfile = os.path.splitext(infile)[0] + ".thumbnail" if infile != outfile: try: im = Image.open(infile) im.thumbnail(size) im.save(outfile, "JPEG") except IOError: print("cannot create thumbnail for", infile)重要的是要注意,除非确实需要,否则库不会解码或加载栅格数据。当您打开文件时,将读取文件头以确定文件格式并提取解码文件所需的模式,大小和其他属性等内容,但文件的其余部分直到稍后才会处理。
这意味着打开图像文件是一种快速操作,它与文件大小和压缩类型无关。这是一个快速识别一组图像文件的简单脚本:
剪切,粘贴和合并图像
本
Image
类包含让您在图像内操作区域的方法。要从图像中提取子矩形,请使用该crop()
方法。从图像复制子矩形
box = (100, 100, 400, 400) region = im.crop(box)该区域由4元组定义,其中坐标为(左,上,右,下)。Python Imaging Library使用左上角带有(0,0)的坐标系。另请注意,坐标是指像素之间的位置,因此上例中的区域恰好是300x300像素。
现在可以以某种方式处理该区域并粘贴回来。
处理子矩形并将其粘贴回去
region = region.transpose(Image.ROTATE_180) im.paste(region, box)将区域粘贴回来时,区域的大小必须与给定区域完全匹配。此外,该区域不能延伸到图像之外。但是,原始图像和区域的模式不需要匹配。如果没有,则在粘贴之前会自动转换该区域(有关详细信息,请参阅下面的颜色转换部分 )。
这是另一个例子:
滚动图像
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请注意,从
crop()
操作粘贴回来时,load()
首先调用。这是因为裁剪是一种懒惰的操作。如果load()
未调用,则在粘贴命令中使用图像之前不会执行裁剪操作。这意味着part1
将从image
第一个粘贴已修改的版本中裁剪掉。对于更高级的技巧,粘贴方法也可以将透明蒙版作为可选参数。在此掩码中,值255表示粘贴的图像在该位置是不透明的(也就是说,粘贴的图像应该按原样使用)。值0表示粘贴的图像完全透明。介于两者之间的值表示不同的透明度。例如,粘贴RGBA图像并将其用作蒙版将粘贴图像的不透明部分,但不粘贴其透明背景。
Python Imaging Library还允许您处理多波段图像的各个波段,例如RGB图像。分割方法创建一组新图像,每个图像包含来自原始多波段图像的一个波段。合并功能采用图像的模式和元组,并将它们组合成新图像。以下示例交换RGB图像的三个波段:
拆分和合并波段
r, g, b = im.split() im = Image.merge("RGB", (b, g, r))请注意,对于单波段图像,
split()
返回图像本身。要处理单个色带,您可能需要先将图像转换为“RGB”。几何变换
本
PIL.Image.Image
类包含的方法resize()
和rotate()
图像。前者采用一个元组给出新的大小,后者采用逆时针方向的角度。简单的几何变换
out = im.resize((128, 128)) out = im.rotate(45) # degrees counter-clockwise要以90度的步长旋转图像,您可以使用
rotate()
方法或transpose()
方法。后者也可用于围绕其水平轴或垂直轴翻转图像。转置图像
out = im.transpose(Image.FLIP_LEFT_RIGHT) out = im.transpose(Image.FLIP_TOP_BOTTOM) out = im.transpose(Image.ROTATE_90) out = im.transpose(Image.ROTATE_180) out = im.transpose(Image.ROTATE_270)
transpose(ROTATE)
rotate()
如果扩展标志为真,则操作也可以与操作相同地执行 ,以对图像的大小提供相同的更改。可以通过该
transform()
方法执行更一般形式的图像变换 。颜色变换
Python Imaging Library允许您使用该
convert()
方法在不同像素表示之间转换图像。图像增强
Python Imaging Library提供了许多可用于增强图像的方法和模块。
过滤器
该
ImageFilter
模块包含许多可与该filter()
方法一起使用的预定义增强过滤器 。点操作
该
point()
方法可用于转换图像的像素值(例如,图像对比度操纵)。在大多数情况下,可以将期望一个参数的函数对象传递给此方法。根据该功能处理每个像素:应用点变换
# multiply each pixel by 1.2 out = im.point(lambda i: i * 1.2)使用上述技术,您可以快速将任何简单表达式应用于图像。您还可以组合使用
point()
和paste()
方法来有选择地修改图像:处理各个频段
# split the image into individual bands source = im.split() R, G, B = 0, 1, 2 # select regions where red is less than 100 mask = source[R].point(lambda i: i < 100 and 255) # process the green band out = source[G].point(lambda i: i * 0.7) # paste the processed band back, but only where red was < 100 source[G].paste(out, None, mask) # build a new multiband image im = Image.merge(im.mode, source)请注意用于创建掩码的语法:
imout = im.point(lambda i: expression and 255)Python仅在确定结果时评估逻辑表达式的部分,并返回作为表达式结果检查的最后一个值。因此,如果上面的表达式为false(0),Python不会查看第二个操作数,因此返回0.否则返回255。
图像序列
Python Imaging Library包含对图像序列(也称为动画格式)的一些基本支持。支持的序列格式包括FLI / FLC,GIF和一些实验格式。TIFF文件还可以包含多个帧。
打开序列文件时,PIL会自动加载序列中的第一帧。您可以使用seek和tell方法在不同的帧之间移动:
后记打印
Python Imaging Library包含在Postscript打印机上打印图像,文本和图形的功能。这是一个简单的例子:
绘图后记
from PIL import Image from PIL import PSDraw im = Image.open("hopper.ppm") title = "hopper" box = (1*72, 2*72, 7*72, 10*72) # in points ps = PSDraw.PSDraw() # default is sys.stdout ps.begin_document(title) # draw the image (75 dpi) ps.image(box, im, 75) ps.rectangle(box) # draw title ps.setfont("HelveticaNarrow-Bold", 36) ps.text((3*72, 4*72), title) ps.end_document()更多关于阅读图像
如前所述,模块的
open()
功能 用于打开图像文件。在大多数情况下,只需将文件名作为参数传递:from PIL import Image im = Image.open("hopper.ppm")如果一切顺利,结果就是一个
PIL.Image.Image
对象。否则,IOError
会引发异常。您可以使用类似文件的对象而不是文件名。该对象必须实现
read()
,seek()
和tell()
方法,并在二进制模式打开。从打开的文件中读取
from PIL import Image with open("hopper.ppm", "rb") as fp: im = Image.open(fp)要从字符串数据中读取图像,请使用以下
StringIO
类:从字符串中读取
import StringIO im = Image.open(StringIO.StringIO(buffer))请注意,库
seek(0)
在读取图像标题之前会对文件进行倒带(使用)。此外,当读取图像数据时(通过加载方法)也将使用搜索。如果映像文件嵌入在较大的文件中,例如tar文件,则可以使用ContainerIO
或TarIO
模块来访问它。控制解码器
某些解码器允许您在从文件中读取图像时操作图像。这通常可用于在创建缩略图时(当速度通常比质量更重要时)加速解码并打印到单色激光打印机(当只需要图像的灰度版本时)。
该
draft()
方法操纵已打开但尚未加载的图像,以使其尽可能匹配给定的模式和大小。这是通过重新配置图像解码器来完成的。阅读草稿模式
这仅适用于JPEG和MPO文件。
from PIL import Image from __future__ import print_function im = Image.open(file) print("original =", im.mode, im.size) im.draft("L", (100, 100)) print("draft =", im.mode, im.size)这打印像:
original = RGB (512, 512) draft = L (128, 128)请注意,生成的图像可能与请求的模式和大小不完全匹配。要确保图像不大于给定大小,请改用缩略图方法。
翻译自https://pillow.readthedocs.io/en/5.2.x/handbook/tutorial.html