2009-10-01 10 views

risposta

5

È possibile utilizzare Python Imaging Library (noto anche come PIL) per leggere le intestazioni di immagine e interrogare le dimensioni.

Un modo per avvicinarsi sarebbe scrivere una funzione che prende un nome file e restituisce le dimensioni (utilizzando PIL). Quindi utilizzare la funzione os.path.walk per attraversare tutti i file nella directory, applicando questa funzione. Raccogliendo i risultati, è possibile creare un dizionario di mappature filename -> dimensions, quindi utilizzare un elenco di comprensione (vedere itertools) per filtrare quelli che non corrispondono alla dimensione richiesta.

+0

Ho fatto questo ma con os.listdir invece .. funziona piuttosto bene con ~ 700 immagini. Os.path.walk è migliore? – john2x

+0

Se 'os.listdir' fa quello che ti serve, va bene. La differenza principale è che 'os.walk' ricercherà in sottodirectory. – gavinb

5

Un modo comune è quello di utilizzare PIL, la libreria di imaging python per ottenere le dimensioni:

from PIL import Image 
import os.path 

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

allora avete bisogno di un ciclo sui file nella directory, controllare le dimensioni contro i tuoi dimensioni richieste, e spostare quei file che non corrispondono.

14

Se non è necessario il resto del PIL e vogliono solo le dimensioni dell'immagine di PNG, JPEG e GIF allora questa piccola funzione (licenza BSD) fa il lavoro bene:

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

Questo funziona per me come un fascino, +1 per avere una soluzione senza librerie di terze parti. – Mercury

2

Ecco uno script che fa quello che ti serve:

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

Sono quasi soddisfatto delle risposte fornite in quanto mi hanno aiutato a scrivere un'altra semplice risposta per questo domanda.

Come la risposta di cui sopra hanno solo script in modo che i lettori devono eseguire per verificare se funzionano bene o no. Così ho deciso di risolvere il problema usando una programmazione in modalità interattiva (dalla shell Python).

Penso che sarà chiaro per voi. Sto usando Python 2.7.12 e ho installato la libreria Pillow per utilizzare il PIL per accedere alle immagini. Ho un sacco di immagini jpg e 1 immagine png nella mia directory corrente.

Passiamo ora alla shell 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) 

In folder_images si freccia directory in cui è Imagens. size_images è una variabile con la dimensione delle immagini, in questo formato.

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

Mentre l'idea dietro il tuo codice è buona, manca una spiegazione. Farò anche notare che le variabili che sono in maiuscolo sono solitamente usate per le costanti, quindi usarlo per un dict come hai fatto con 'SIZE_IMAGES' non è qualcosa che consiglierei. – PLPeeters

+0

Per favore, potrei rivalutare la mia risposta. –

Problemi correlati