2009-10-01 31 views

回答

5

您可以使用Python Imaging Library(又名PIL)读取图像标题并查询尺寸。

接近它的一种方法是编写一个函数,它接受一个文件名并返回维度(使用PIL)。然后使用os.path.walk函数遍历目录中的所有文件,并使用此函数。收集结果后,您可以创建一个映射字典filename -> dimensions,然后使用列表理解(请参阅itertools)过滤掉那些不符合所需大小的字典。

+0

我做到了这一点,但与os.listdir相反..与700图像工作得很好。 os.path.walk更好吗? – john2x 2009-10-03 16:07:59

+0

如果'os.listdir'完成你所需要的,那很好。主要的区别是'os.walk'会递归到子目录中。 – gavinb 2009-10-04 01:38:25

5

一种常见的方法是使用PIL,Python图像库,以获得尺寸:

from PIL import Image 
import os.path 

filename = os.path.join('path', 'to', 'image', 'file') 
img = Image.open(filename) 
print img.size 

然后,你需要遍历目录中的文件,检查尺寸对你的要求的尺寸,并移动那些不匹配的文件。

14

如果您不需要PIL的休息,只想PNG,JPEG和GIF然后这个小功能(BSD许可证)的图像尺寸很好地做这项工作:

http://code.google.com/p/bfg-pages/source/browse/trunk/pages/getimageinfo.py

import StringIO 
import struct 

def getImageInfo(data): 
    data = str(data) 
    size = len(data) 
    height = -1 
    width = -1 
    content_type = '' 

    # handle GIFs 
    if (size >= 10) and data[:6] in ('GIF87a', 'GIF89a'): 
     # Check to see if content_type is correct 
     content_type = 'image/gif' 
     w, h = struct.unpack("<HH", data[6:10]) 
     width = int(w) 
     height = int(h) 

    # See PNG 2. Edition spec (http://www.w3.org/TR/PNG/) 
    # Bytes 0-7 are below, 4-byte chunk length, then 'IHDR' 
    # and finally the 4-byte width, height 
    elif ((size >= 24) and data.startswith('\211PNG\r\n\032\n') 
      and (data[12:16] == 'IHDR')): 
     content_type = 'image/png' 
     w, h = struct.unpack(">LL", data[16:24]) 
     width = int(w) 
     height = int(h) 

    # Maybe this is for an older PNG version. 
    elif (size >= 16) and data.startswith('\211PNG\r\n\032\n'): 
     # Check to see if we have the right content type 
     content_type = 'image/png' 
     w, h = struct.unpack(">LL", data[8:16]) 
     width = int(w) 
     height = int(h) 

    # handle JPEGs 
    elif (size >= 2) and data.startswith('\377\330'): 
     content_type = 'image/jpeg' 
     jpeg = StringIO.StringIO(data) 
     jpeg.read(2) 
     b = jpeg.read(1) 
     try: 
      while (b and ord(b) != 0xDA): 
       while (ord(b) != 0xFF): b = jpeg.read(1) 
       while (ord(b) == 0xFF): b = jpeg.read(1) 
       if (ord(b) >= 0xC0 and ord(b) <= 0xC3): 
        jpeg.read(3) 
        h, w = struct.unpack(">HH", jpeg.read(4)) 
        break 
       else: 
        jpeg.read(int(struct.unpack(">H", jpeg.read(2))[0])-2) 
       b = jpeg.read(1) 
      width = int(w) 
      height = int(h) 
     except struct.error: 
      pass 
     except ValueError: 
      pass 

    return content_type, width, height 
+0

这对我来说就像一个魅力,+1给予没有第三方库的解决方案。 – Mercury 2016-11-02 10:34:32

2

这是一个脚本,它可以满足你的需求:

#!/usr/bin/env python 

""" 
Get information about images in a folder. 
""" 

from os import listdir 
from os.path import isfile, join 

from PIL import Image 


def print_data(data): 
    """ 
    Parameters 
    ---------- 
    data : dict 
    """ 
    for k, v in data.items(): 
     print("%s:\t%s" % (k, v)) 
    print("Min width: %i" % data['min_width']) 
    print("Max width: %i" % data['max_width']) 
    print("Min height: %i" % data['min_height']) 
    print("Max height: %i" % data['max_height']) 


def main(path): 
    """ 
    Parameters 
    ---------- 
    path : str 
     Path where to look for image files. 
    """ 
    onlyfiles = [f for f in listdir(path) if isfile(join(path, f))] 

    # Filter files by extension 
    onlyfiles = [f for f in onlyfiles if f.endswith('.jpg')] 

    data = {} 
    data['images_count'] = len(onlyfiles) 
    data['min_width'] = 10**100 # No image will be bigger than that 
    data['max_width'] = 0 
    data['min_height'] = 10**100 # No image will be bigger than that 
    data['max_height'] = 0 

    for filename in onlyfiles: 
     im = Image.open(filename) 
     width, height = im.size 
     data['min_width'] = min(width, data['min_width']) 
     data['max_width'] = max(width, data['max_height']) 
     data['min_height'] = min(height, data['min_height']) 
     data['max_height'] = max(height, data['max_height']) 

    print_data(data) 


if __name__ == '__main__': 
    main(path='.') 
0

我对上面提供的答案非常满意,因为那些帮助我为此编写了另一个简单的答案题。

由于上述答案只有脚本,因此读者需要运行以检查它们是否正常工作。所以我决定使用交互模式编程(从Python shell)解决问题。

我认为这一点很清楚。我正在使用Python 2.7.12和我已经安装枕头图书馆使用PIL访问images.I在我目前的目录中有很多jpg mages和1 png图像。

现在让我们继续讨论Python shell。

>>> #Date of creation : 3 March 2017 
>>> #Python version : 2.7.12 
>>> 
>>> import os   #Importing os module 
>>> import glob  #Importing glob module to list the same type of image files like jpg/png(here) 
>>> 
>>> for extension in ["jpg", 'png']: 
...  print "List of all "+extension+" files in current directory:-" 
...  i = 1 
...  for imgfile in glob.glob("*."+extension): 
...   print i,") ",imgfile 
...   i += 1 
...  print "\n" 
... 
List of all jpg files in current directory:- 
1) 002-tower-babel.jpg 
2) 1454906.jpg 
3) 69151278-great-hd-wallpapers.jpg 
4) amazing-ancient-wallpaper.jpg 
5) Ancient-Rome.jpg 
6) babel_full.jpg 
7) Cuba-is-wonderfull.jpg 
8) Cute-Polar-Bear-Images-07775.jpg 
9) Cute-Polar-Bear-Widescreen-Wallpapers-07781.jpg 
10) Hard-work-without-a-lh.jpg 
11) jpeg422jfif.jpg 
12) moscow-park.jpg 
13) moscow_city_night_winter_58404_1920x1080.jpg 
14) Photo1569.jpg 
15) Pineapple-HD-Photos-03691.jpg 
16) Roman_forum_cropped.jpg 
17) socrates.jpg 
18) socrates_statement1.jpg 
19) steve-jobs.jpg 
20) The_Great_Wall_of_China_at_Jinshanling-edit.jpg 
21) torenvanbabel_grt.jpg 
22) tower_of_babel4.jpg 
23) valckenborch_babel_1595_grt.jpg 
24) Wall-of-China-17.jpg 


List of all png files in current directory:- 
1) gergo-hungary.png 


>>> #So let's display all the resolutions with the filename 
... from PIL import Image #Importing Python Imaging library(PIL) 
>>> for extension in ["jpg", 'png']: 
...  i = 1 
...  for imgfile in glob.glob("*."+extension): 
...   img = Image.open(imgfile) 
...   print i,") ",imgfile,", resolution: ",img.size[0],"x",img.size[1] 
...   i += 1 
...  print "\n" 
... 
1) 002-tower-babel.jpg , resolution: 1024 x 768 
2) 1454906.jpg , resolution: 1920 x 1080 
3) 69151278-great-hd-wallpapers.jpg , resolution: 5120 x 2880 
4) amazing-ancient-wallpaper.jpg , resolution: 1920 x 1080 
5) Ancient-Rome.jpg , resolution: 1000 x 667 
6) babel_full.jpg , resolution: 1464 x 1142 
7) Cuba-is-wonderfull.jpg , resolution: 1366 x 768 
8) Cute-Polar-Bear-Images-07775.jpg , resolution: 1600 x 1067 
9) Cute-Polar-Bear-Widescreen-Wallpapers-07781.jpg , resolution: 2300 x 1610 
10) Hard-work-without-a-lh.jpg , resolution: 650 x 346 
11) jpeg422jfif.jpg , resolution: 2048 x 1536 
12) moscow-park.jpg , resolution: 1920 x 1200 
13) moscow_city_night_winter_58404_1920x1080.jpg , resolution: 1920 x 1080 
14) Photo1569.jpg , resolution: 480 x 640 
15) Pineapple-HD-Photos-03691.jpg , resolution: 2365 x 1774 
16) Roman_forum_cropped.jpg , resolution: 4420 x 1572 
17) socrates.jpg , resolution: 852 x 480 
18) socrates_statement1.jpg , resolution: 1280 x 720 
19) steve-jobs.jpg , resolution: 1920 x 1080 
20) The_Great_Wall_of_China_at_Jinshanling-edit.jpg , resolution: 4288 x 2848 
21) torenvanbabel_grt.jpg , resolution: 1100 x 805 
22) tower_of_babel4.jpg , resolution: 1707 x 956 
23) valckenborch_babel_1595_grt.jpg , resolution: 1100 x 748 
24) Wall-of-China-17.jpg , resolution: 1920 x 1200 


1) gergo-hungary.png , resolution: 1236 x 928 


>>> 
-1
 
import os 
from PIL import Image 

folder_images = "/tmp/photos" 
size_images = dict() 

for dirpath, _, filenames in os.walk(folder_images): 
    for path_image in filenames: 
     image = os.path.abspath(os.path.join(dirpath, path_image)) 
     with Image.open(image) as img: 
      width, heigth = img.size 
      SIZE_IMAGES[path_image] = {'width': width, 'heigth': heigth} 

print(size_images) 

folder_images您箭头目录,它是imagens。 size_images是一个具有图像大小的变量,采用这种格式。

 
Example 
{'image_name.jpg' : {'width': 100, 'heigth': 100} } 
+0

尽管代码背后的想法很好,但它没有解释。我还会指出,所有大写字母的变量通常用于常量,所以将它用于像“SIZE_IMAGES”一样的字典不是我会推荐的。 – PLPeeters 2017-03-03 13:48:39

+0

请,我可以重新评估我的答案。 – 2017-03-03 14:03:27