PIL教程
使用图像类
在python图像处理库(即PIL)中最重要的类是Image类,在模块中的定义也是同样的。你可以有多种方法创建这个类的实例,可以从文件中加载图像,处理其它图像,抑或从零开始创建一个图像。
从文件中加载一个图像,可以使用Image 模块中的open函数。
>>> import Image
>>> im = Image.open("lena.ppm")
如果成功,这个函数会返回一个Image对象。你现在可以使用这个实例的属性去检查这个图片文件的内容。
>>> print im.format, im.size, im.mode
PPM (512, 512) RGB
通过format方法可以辨别出图片的来源。如果这个图片不是从一个文件中读取的,它将被设置为None。Size属性是一个两个元素的元组,包含着图像的高和宽。Mode属性定义着图像的颜色空间,像素的数据类型和深度。通常,’‘L’’(luminance)代表图片为灰度图,"RGB"代表图片真实的彩色图,"CMYK"用于将要印刷的图片。
如果文件没有被打开,IOError异常将会被抛出。
一旦你有了一个Image类的实列,你便可以使用这个类中定义的方法去处理和操作这个图片了。例如,我们展示出我们刚刚读入的图片:
>>> im.show()
(标准版本的show函数并不是非常高效,原因是它首先将图像存成的一个临时文件然后调用xv程序去展示这个图像。如果你没有安装xv,它甚至不会工作。但是,当它确实工作的时候,它将给调试和测试带来极大的方便。)
下面的部分将提供这个库中包含的函数的概览。
读写图像
PIL库支持很多种类的的图像格式。从硬盘中读取文件的时候,可以使用Image模块中的open函数。你打开一个图像的时候不需要去知道这个图像的格式。库会自动地根据文件的内容来确定图片的格式。
如果要存储图片,可以使用Image中的save方法。当存储图片的时候,图片名字变得重要起来。除非你指定格式,PIL库用文件的名的后缀来判断使用用哪一种存储格式。
Convert files to JPEG
import os, sys
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方法,这将显式地指明存储格式。如果使用非标准扩展名,则必须始终按以下方式指定格式:
Create JPEG Thumbnails
import os, sys
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
需要注意的是,除非确实需要,否则库不会解码或加载光栅数据。打开文件时,将读取文件头以确定文件格式,并提取解码文件所需的模式、大小和其他属性等内容,但稍后才会处理其余文件。
这意味着打开图像文件是一个快速的操作,与文件大小和压缩类型无关。下面是一个快速识别一组图像文件的简单脚本:
Identify Image Files
import sys
import Image
for infile in sys.argv[1:]:
try:
im = Image.open(infile)
print infile, im.format, "%dx%d" % im.size, im.mode
except IOError:
pass