分类: Python/Ruby
2010-05-30 11:51:21
使用Image类
在PIL中最重要的类就是Image类,它在模块中以相同的名称定义。你可以用多种方式创建该类的实例:包括从文件中载放图像,处理其它图像所得,及从草稿中创建图像。
从文件中裁入图像,使用Imag模块中的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,它甚至可能无法使用.不过当它可用的时候,还是能够非常方便地调试与测试.)
–译注,xv是Unix下的一个看图工具,在windows是,应该是调用系统默认的工具打开图像.
接下来的部分,我们给出这个库中的一些不同函数的总览.
读写图像
PIL支持大范围的图像格式.从硬盘中读取图像,使用Image模块中的open函数.你不需要在打开文件的时候给出文件类型.图像库自动根据文件内容来决定格式.
保存一枚图像,使用Image模块中的save函数.在保存图像的时候,文件名就像得很重要了.除非你指定格式,否则图像库使用文件扩展名来确定文件所用的存储格式.
Example: 将图像转化为JPEG
import os, sys
import Image
for infile in sys.argv[1:]:
outfile = os.path.splitext(infile)[0] + “.jpg”
if infile != outfile:
try:
Image.open(infile).save(outfile)
except IOError:
print “cannot convert”, infile
可以稍微花时间讨论一下显示指定文件格式时的save方法.如果你使用一个非标准的扩展名,就必须始终以这种方式指定文件格式:
Example: 创建JPEG图像的缩略图
import os, sys
import Image
for infile in sys.argv[1:]:
outfile = os.path.splitext(infile)[0] + “.thumbnail”
if infile != outfile:
try:
im = Image.open(infile)
im.thumbnail((128, 128))
im.save(outfile, “JPEG”)
except IOError:
print “cannot create thumbnail for”, infile
若非真有必要,图像库并不会去解码或载入栅格数据,注意这一点很重要.当你打开一个图像文件,读取文件头就得了文件的格式,压缩模式,大小和其它解码该文件所需要的属性.但文件的其它部分则要稍后处理.
这意味着打开一枚图像是一个非常快速的操作,它与图像的大小及压缩方式都没有关系.这里是快速查看一堆图像属性的简单脚本:
Example:打印图像属性
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