2009-10-01 4 views

Antwort

5

Sie können die Python Imaging Library (aka PIL) verwenden, um die Bildüberschriften zu lesen und die Dimensionen abzufragen.

Eine Möglichkeit, es zu erreichen, wäre, sich eine Funktion zu schreiben, die einen Dateinamen annimmt und die Dimensionen zurückgibt (mit PIL). Verwenden Sie dann die Funktion os.path.walk, um alle Dateien im Verzeichnis zu durchlaufen, indem Sie diese Funktion anwenden. Sammeln Sie die Ergebnisse, können Sie ein Verzeichnis der Zuordnungen erstellen filename -> dimensions, dann verwenden Sie eine Liste Verständnis (siehe itertools), um diejenigen herauszufiltern, die nicht die erforderliche Größe entsprechen.

+0

Ich habe dies aber mit os.listdir stattdessen .. funktioniert ziemlich gut mit ~ 700 Bildern. Ist os.path.walk besser? – john2x

+0

Wenn 'os.listdir' tut, was Sie brauchen, ist das in Ordnung. Der Hauptunterschied besteht darin, dass "os.walk" in Unterverzeichnisse zurückspringt. – gavinb

5

Eine gängige Methode ist PIL, die Python Imaging-Bibliothek zu verwenden, um die Dimensionen zu erhalten:

from PIL import Image 
import os.path 

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

Dann sind Sie über die Dateien in Ihrem Verzeichnis Schleife müssen, überprüfen Sie die Dimensionen gegen Ihre erforderlichen Abmessungen und Bewegung diese Dateien, die nicht übereinstimmen.

14

Wenn Sie nicht brauchen, um den Rest von PIL und wollen einfach nur Bildabmessungen von PNG, JPEG und GIF dann diese kleine Funktion (BSD-Lizenz) macht den Job gut:

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

Das funktioniert für mich wie ein Zauber, +1 für eine Lösung ohne 3rd Party Libraries. – Mercury

2

Hier ist ein Skript, das das tut, was Sie brauchen:

#!/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

Ich bin ziemlich zufrieden mit den oben angegebenen Antworten, da diese mir geholfen haben, eine weitere einfache Antwort dafür zu schreiben Frage.

Da die obige Antwort nur Skripte haben, müssen die Leser laufen, um diese zu überprüfen, ob sie gut funktionieren oder nicht. Also entschied ich mich, das Problem mit einer interaktiven Modus-Programmierung (aus der Python-Shell) zu lösen.

Ich denke, es wird Ihnen klar sein. Ich benutze Python 2.7.12 und ich habe installiert Kissen Bibliothek PIL für den Zugriff auf Bilder zu verwenden.Ich habe eine Menge von JPG Mages und 1 PNG Bild in meinem aktuellen Verzeichnis.

Kommen wir nun zur 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) 

In folder_images arrow Sie Verzeichnis, in dem es imagens ist. size_images ist eine Variable mit der Größe der Bilder, in diesem Format.

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

Während die Idee hinter Ihrem Code gut ist, fehlt eine Erklärung. Ich werde auch darauf hinweisen, dass Variablen, die in Großbuchstaben geschrieben sind, normalerweise für Konstanten verwendet werden. Daher wäre es nicht empfehlenswert, sie für ein Diktat wie "SIZE_IMAGES" zu verwenden. – PLPeeters

+0

Bitte, ich könnte meine Antwort neu bewerten. –