|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
接上一节.......点我直达上节
图像阵列
Python Imaging Library 支持一些对基本图像阵列. 其中包括 FLI/FLC, GIF, 和其它的一些格式. TIFF 文件则包含了多个帧.
当你试图打开一个图像阵列图片, PIL 会自动的加载这个阵列的首帧. 你可以使用一些方法来切换不同的帧:
读取阵列
- from PIL import Image
- im = Image.open("animation.gif")
- im.seek(1) # skip to the second frame
- try:
- while 1:
- im.seek(im.tell()+1)
- # do something to im
- except EOFError:
- pass # end of sequence
复制代码
如你所见, 在帧尾时会得到一个 EOFError 异常.
值得注意的是, 目前版本的库仅仅支持你顺序加载帧. 如果你想回头的话, 只能重新加载图像文件.
下列类允许你使用 for 语句来迭代这个序列:
使用图像序列迭代器
- from PIL import ImageSequence
- for frame in ImageSequence.Iterator(im):
- # ...do something to frame...
复制代码
Postscript 打印
Python Imaging Library 包含了一些用于输出图像的函数, 文字和在 Postscript 上的图像. 见下例:
绘制 Postscript
- from PIL import Image
- from PIL import PSDraw
- im = Image.open("lena.ppm")
- title = "lena"
- 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()
复制代码
更多关于读取图片
在上文中, Image 模块里的 open() 函数用于打开图片文件. 但是在大多数情况中, 你可以优雅的打开它, 像这样:
- im = Image.open("lena.ppm")
复制代码
如果没有报错, 返回值是 PIL.Image.Image 对象. 反之则会抛出一个 IOError 异常.
你可以使用文件对象来代替文件名. 这个对象必须以 read(),
seek() 和 tell() 方法, 并且以二进制方式打开.
从打开的文件中读取图片
- fp = open("lena.ppm", "rb")
- im = Image.open(fp)
复制代码
要想从字符串中读取文件, 使用 StringIO 类来实现:
从字符串中读取图片
- import StringIO
- im = Image.open(StringIO.StringIO(buffer))
复制代码
请注意, 使用库的时候会重置指针到文件开头. 另外, 在读取图片的时候也要用到文件指针. 如果图片文件被嵌入到了一个大文件, 例如 tar 文件, 你可以使用 ContainerIO 或者 TarIO 模块来处理它.
从tar文件中读取
- from PIL import TarIO
- fp = TarIO.TarIO("Imaging.tar", "Imaging/test/lena.ppm")
- im = Image.open(fp)
复制代码
控制解码器
一些解码器允许你在读取文件的时候操作图片. 这个在创建缩略图的时候相当有用, 可以成倍的加快读取速度.
draft() 方法可以操作一个仅打开但是未加载的图片. 只需要你重新配置图片解码器即可完成.
使用模拟模式
- 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)
复制代码
值得注意的是, 结果图像可能不满足要求模式和大小. 要想确保图像和给定大小没有出入, 使用缩略图方法替代之.
(完)
|
|