2009-10-01 23 views

Respuesta

5

Puede utilizar el Python Imaging Library (también conocido como PIL) para leer los encabezados de imagen y consultar las dimensiones.

Una manera de acercarse a ella sería escribir usted mismo una función que toma un nombre de archivo y devuelve las dimensiones (usando PIL). Luego use la función os.path.walk para recorrer todos los archivos en el directorio, aplicando esta función. Recopilación de los resultados, se puede construir un diccionario de asignaciones filename -> dimensions, a continuación, utilizar una lista por comprensión (ver itertools) para filtrar los que no coincide con el tamaño requerido.

+0

lo hice pero con os.listdir lugar .. funciona bastante bien con ~ 700 imágenes. ¿Os.path.walk es mejor? – john2x

+0

Si 'os.listdir' hace lo que necesita, está bien. La principal diferencia es que 'os.walk' se repetirá en subdirectorios. – gavinb

5

Una forma común es utilizar PIL, la biblioteca de imágenes de Python para obtener las dimensiones:

from PIL import Image 
import os.path 

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

entonces usted necesita para recorrer los archivos en el directorio, comprobar las dimensiones contra sus dimensiones requeridas, y nos movemos aquellos archivos que no coinciden.

14

Si usted no necesita el resto de PIL y sólo quiere dimensiones de imagen de PNG, JPEG y GIF entonces este evento pequeño (licencia BSD) hace el trabajo muy bien:

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

Esto funciona para mí como un amuleto, +1 para una solución dada sin bibliotecas de terceros. – Mercury

2

Aquí hay una secuencia de comandos que hace lo que necesita:

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

Estoy bastante satisfecho con las respuestas proporcionadas anteriormente, ya que me ayudaron a escribir otra respuesta simple para esto pregunta.

Como la respuesta anterior sólo tienen secuencias de comandos por lo que los lectores necesitan funcionar para comprobar si éstos funciona bien o no. Así que decidí resolver el problema usando una programación en modo interactivo (desde el shell Python).

Creo que será claro para usted. Estoy usando Python 2.7.12 y he instalado biblioteca Almohada a utilizar para acceder a PIL images.I tienen una imagen PNG 1 montón de magos jpg y en mi directorio actual.

Ahora vamos a pasar a la terminal de Python.

>>> #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) 

En folder_images se arrow directorio donde está imagens. size_images es una variable con el tamaño de las imágenes, en este formato.

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

Si bien la idea detrás de tu código es buena, carece de una explicación. También señalaré que las variables que están en mayúsculas se utilizan generalmente para las constantes, por lo que usarlo para un dict como lo hizo con 'SIZE_IMAGES' no es algo que recomendaría. – PLPeeters

+0

Por favor, podría volver a evaluar mi respuesta. –

Cuestiones relacionadas