参考来自http://effbot.org/imagingbook/introduction.htm以及PIL中文手册
1.使用 Image 类
Python Imaging Library中最重要的类是Image 类,它定义在与它同名的模块中。
有多种创建这个类的对象的方法:可以从文件中读取得到,也可以从其他图像经处理得到,或者创建一个全新的。
要从文件读取图像,可以使用Image.open 函数。
>>> import Image
>>> im = Image.open("2.jpg")
>>> print im.format,im.size,im.mode
JPEG (180, 237) RGB
>>> im.show()
format 属性表示图像的原始格式。如果图像不是从文件中读取的,则它被设置成 None。
size 属性是一个2元组,表示图像的宽度和高度 (以像素为单位)。
mode 属性定义图像的色彩通道的数量与名字,同时也包括像素的类型和颜色深度信息。
通常来说,灰度图像的mode是"L"(luminance),真彩色图像的mode是 "RGB" ,而用来打印的图像的mode是"CMYK"。
2.读写图像
PIL支持很多种的图象文件格式。要从磁盘上读取文件,使用 Image 模块提供的open 函数。你不必了解你要打开的文件的格式,库会自动根据文件的内容来确定图像的格式。
要保存文件,使用Image 类的save 方法。保存文件时,文件名就变得非常重要,除非你指定格式,否则库会根据文件扩展名来决定使用哪种格式存储。将文件转换成 JPEG:命令行输入infile
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)
print outfile
Image.open(outfile).show()
except IOError:
print "cannot convert", infile
【注意】调用show方法时,win7自带的图片查看器可能会失败,这里我用的是PhotoFiltre 7
创建 JPEG 缩略图
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")
im.show()
except IOError:
print "cannot create thumbnail for", infile
3.裁剪、粘贴和合并图像
import Image
box = (100, 100, 400, 400)
im = Image.open('3.jpg')
region = im.crop(box)
region = region.transpose(Image.ROTATE_180)
im.paste(region, box)
im.show()
Image 类提供一些对图像中的某一区域进行处理的方法。要从图像中提取一块子矩形区域,使用
crop方法区域由一个4元组定义,表示为坐标是 (left, upper,right, lower)。
PIL使用左上角为 (0, 0)的坐标系统。同时要注意,这些坐标指向像素之间的位置,因此上述例子中描述的区域的大小为300x300像素。
区域图像能够经过某些特定的处理并粘回原处。当把区域粘回图像时,指定的区域大小必须和区域图像的大小相同。
此外,区域不能超出图像的边界。然而,原始图像的模式和区域图像的模式不必相同。如果不相同,区域图像的模式会在粘贴前被自动转换。
另外一个例子:滚动一幅图像
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))
image.paste(part2, (0, 0, xsize-delta, ysize))
image.paste(part1, (xsize-delta, 0, xsize, ysize))
return image