鱼C论坛

 找回密码
 立即注册
查看: 3303|回复: 0

[技术交流] Pillow库官方文档翻译-快速上手(三)

[复制链接]
发表于 2016-6-10 18:41:10 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
接上一节.......点我直达上节

图像阵列

Python Imaging Library 支持一些对基本图像阵列. 其中包括 FLI/FLC, GIF, 和其它的一些格式. TIFF 文件则包含了多个帧.

当你试图打开一个图像阵列图片, PIL 会自动的加载这个阵列的首帧. 你可以使用一些方法来切换不同的帧:

读取阵列

  1. from PIL import Image

  2. im = Image.open("animation.gif")
  3. im.seek(1) # skip to the second frame

  4. try:
  5.     while 1:
  6.         im.seek(im.tell()+1)
  7.         # do something to im
  8. except EOFError:
  9.     pass # end of sequence
复制代码

如你所见, 在帧尾时会得到一个 EOFError 异常.

值得注意的是, 目前版本的库仅仅支持你顺序加载帧. 如果你想回头的话, 只能重新加载图像文件.

下列类允许你使用 for 语句来迭代这个序列:

使用图像序列迭代器

  1. from PIL import ImageSequence
  2. for frame in ImageSequence.Iterator(im):
  3.     # ...do something to frame...
复制代码

Postscript 打印

Python Imaging Library 包含了一些用于输出图像的函数, 文字和在 Postscript 上的图像. 见下例:

绘制 Postscript

  1. from PIL import Image
  2. from PIL import PSDraw

  3. im = Image.open("lena.ppm")
  4. title = "lena"
  5. box = (1*72, 2*72, 7*72, 10*72) # in points

  6. ps = PSDraw.PSDraw() # default is sys.stdout
  7. ps.begin_document(title)

  8. # draw the image (75 dpi)
  9. ps.image(box, im, 75)
  10. ps.rectangle(box)

  11. # draw title
  12. ps.setfont("HelveticaNarrow-Bold", 36)
  13. ps.text((3*72, 4*72), title)

  14. ps.end_document()
复制代码

更多关于读取图片

在上文中, Image 模块里的 open() 函数用于打开图片文件. 但是在大多数情况中, 你可以优雅的打开它, 像这样:

  1. im = Image.open("lena.ppm")
复制代码

如果没有报错, 返回值是 PIL.Image.Image 对象. 反之则会抛出一个 IOError 异常.

你可以使用文件对象来代替文件名. 这个对象必须以 read(),
seek() 和 tell() 方法, 并且以二进制方式打开.

从打开的文件中读取图片

  1. fp = open("lena.ppm", "rb")
  2. im = Image.open(fp)
复制代码

要想从字符串中读取文件, 使用 StringIO 类来实现:

从字符串中读取图片

  1. import StringIO

  2. im = Image.open(StringIO.StringIO(buffer))
复制代码

请注意, 使用库的时候会重置指针到文件开头. 另外, 在读取图片的时候也要用到文件指针. 如果图片文件被嵌入到了一个大文件, 例如 tar 文件, 你可以使用 ContainerIO 或者 TarIO 模块来处理它.

从tar文件中读取

  1. from PIL import TarIO

  2. fp = TarIO.TarIO("Imaging.tar", "Imaging/test/lena.ppm")
  3. im = Image.open(fp)
复制代码

控制解码器

一些解码器允许你在读取文件的时候操作图片. 这个在创建缩略图的时候相当有用, 可以成倍的加快读取速度.

draft() 方法可以操作一个仅打开但是未加载的图片. 只需要你重新配置图片解码器即可完成.

使用模拟模式

  1. from __future__ import print_function
  2. im = Image.open(file)
  3. print("original =", im.mode, im.size)

  4. im.draft("L", (100, 100))
  5. print("draft =", im.mode, im.size)
复制代码

这将输出如下结果:

  1. original = RGB (512, 512)
  2. draft = L (128, 128)
复制代码

值得注意的是, 结果图像可能不满足要求模式和大小. 要想确保图像和给定大小没有出入, 使用缩略图方法替代之.

(完)

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-29 13:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表