2015-10-16 80 views

回答

5

最近枕头版本不需要.seek()

#!/usr/bin/env python 
import sys 
from zipfile import ZipFile 
from PIL import Image # $ pip install pillow 

filename = sys.argv[1] 
with ZipFile(filename) as archive: 
    for entry in archive.infolist(): 
     with archive.open(entry) as file: 
      img = Image.open(file) 
      print(img.size, img.mode, len(img.getdata())) 
+0

谢谢,你知道自哪个版本的Pillow? –

+0

@TorKlingberg:它在2.7上失败。它适用于2.9+。您可以尝试在github上查找特定问题。 – jfs

+0

Image.open的当前[documentation](http://pillow.readthedocs.org/en/3.0.x/reference/Image.html#PIL.Image.open)仍然表示“文件对象必须实现read() ,seek()和tell()方法“ –

2

蟒蛇zipfile确实提供了一个ZipFile.open()返回一个文件对象的zip中的文件,并PillowImage.open()可以采取文件对象从打开。不幸的是,zipfile对象不提供Image.open()需要的seek()方法。

而是读取图像文件到RAM中的字符串(如果它不是太大),并使用StringIO以获取Image.open()文件对象:

from zipfile import ZipFile 
from PIL import Image 
from StringIO import StringIO 

archive = ZipFile("file.zip", 'r') 
image_data = archive.read("image.png") 
fh = StringIO(image_data) 
img = Image.open(fh) 
+1

这可能是最好使用['io.BytesIO'](https://docs.python.org/2/library/io.html#io.BytesIO)代替'StringIO',虽然两者似乎在这种情况下工作。 –

相关问题