Ho bisogno di controllare le dimensioni delle immagini in una directory. Attualmente ha ~ 700 immagini. Ho solo bisogno di controllare le dimensioni, e se la dimensione non corrisponde a una determinata dimensione, verrà spostata in una cartella diversa. Come iniziare?Come controllare le dimensioni di tutte le immagini in una directory usando python?
risposta
È 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.
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.
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
Questo funziona per me come un fascino, +1 per avere una soluzione senza librerie di terze parti. – Mercury
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='.')
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
>>>
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} }
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
Per favore, potrei rivalutare la mia risposta. –
- 1. Carica tutte le immagini da una directory
- 2. Come controllare tutte le classi sotto o usando una classe?
- 3. python- come visualizzare le dimensioni di tutte le variabili
- 4. Come centrare le immagini su una pagina Web per tutte le dimensioni dello schermo
- 5. Recuperare ricorsivamente le dimensioni di una directory
- 6. Carica e visualizza tutte le immagini da una cartella
- 7. grep in tutte le directory
- 8. Rimuovi tutte le immagini
- 9. Python: lettura di tutti i file in tutte le directory
- 10. JavaScript: come caricare tutte le immagini in una cartella?
- 11. Seleziona tutte le immagini PNG
- 12. Come spostare le immagini in iOS da una directory all'altra?
- 13. Come ottenere file in una directory, comprese tutte le sottodirectory
- 14. come elencare tutte le sottodirectory in una directory
- 15. Come si cammina tra le directory usando python?
- 16. Come si preparano le immagini per tutte le risoluzioni Android?
- 17. Controllare le directory in C# utilizzando Linq
- 18. cerca file in tutte le unità usando Python
- 19. Come ridurre le dimensioni di RTF con immagini incorporate?
- 20. Carica tutte le funzioni in PowerShell da una determinata directory
- 21. Quali sono tutte le dimensioni delle immagini necessarie per le immagini su Android per rendere le cose davvero belle?
- 22. Rimuovi tutte le autorizzazioni di directory
- 23. Come pulire le immagini in Python/Django?
- 24. Come visualizzare le immagini da una cartella usando php - PHP
- 25. Jekyll per loop su tutte le immagini in una cartella?
- 26. Aprire le immagini? Python
- 27. Come controllare tutte le check in forma corrente con jquery?
- 28. Acquisizione di tutte le eccezioni in Python
- 29. Tutte le nuove directory hanno 777 autorizzazioni
- 30. Ottenere le dimensioni del monitor in python
Ho fatto questo ma con os.listdir invece .. funziona piuttosto bene con ~ 700 immagini. Os.path.walk è migliore? – john2x
Se 'os.listdir' fa quello che ti serve, va bene. La differenza principale è che 'os.walk' ricercherà in sottodirectory. – gavinb