Necesito verificar las dimensiones de las imágenes en un directorio. Actualmente tiene ~ 700 imágenes. Solo necesito verificar los tamaños, y si el tamaño no coincide con una dimensión dada, se moverá a una carpeta diferente. ¿Cómo empiezo?¿Cómo verificar las dimensiones de todas las imágenes en un directorio usando python?
Respuesta
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.
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.
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
Esto funciona para mí como un amuleto, +1 para una solución dada sin bibliotecas de terceros. – Mercury
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='.')
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
>>>
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} }
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
Por favor, podría volver a evaluar mi respuesta. –
- 1. listado todas las imágenes en un directorio usando PHP
- 2. Python: obtener todas las imágenes de un archivo html
- 3. Ajustar todas las imágenes con un div usando DOMDocument
- 4. Eliminar todas las imágenes
- 5. ¿Cómo verificar si terminaron todas las AsyncTasks?
- 6. Ejecutar todas las pruebas en el directorio usando la nariz
- 7. Verificar recursivamente las actualizaciones del directorio git
- 8. ¿Cómo puedo obtener todas las imágenes de un archivo qrc?
- 9. Descargar todas las imágenes de un único directorio de un sitio web
- 10. Importar todas las clases en el directorio?
- 11. Obtener todas las imágenes url de cadena
- 12. Cambiar el tamaño de las imágenes en el directorio
- 13. Listar todas las carpetas en el directorio
- 14. Cargar y mostrar todas las imágenes de una carpeta
- 15. ¿Cómo eliminar todas las referencias de un objeto en Python?
- 16. ¿Cómo enumerar todas las funciones en un módulo de Python?
- 17. ¿Cómo eliminar las distorsiones radiales de las imágenes usando OpenCV?
- 18. Cargue todas las funciones en PowerShell desde un directorio determinado
- 19. Guardar las dimensiones de las imágenes (ancho y alto) en Paperclip?
- 20. ¿Todas las imágenes de la tienda son las imágenes base, pequeñas y en miniatura de Magento?
- 21. ¿Cómo especifico un comodín en el manifiesto de caché HTML5 para cargar todas las imágenes en un directorio?
- 22. Borrar todas las imágenes agregadas al lienzo
- 23. Cómo incluir todas las imágenes en el archivo jar usando eclipse
- 24. Revisar las dimensiones de la imagen subida
- 25. Python: ¿cómo calcular todas las enésimas raíces de un número?
- 26. Android listar todas las imágenes disponibles
- 27. jQuery se desvanecen todas las demás imágenes
- 28. JavaScript: ¿cómo cargar todas las imágenes en una carpeta?
- 29. Lista de todas las imágenes de fondo en DOM
- 30. Confirmar todas las carpetas y archivos en un directorio usando la línea de comandos
lo hice pero con os.listdir lugar .. funciona bastante bien con ~ 700 imágenes. ¿Os.path.walk es mejor? – john2x
Si 'os.listdir' hace lo que necesita, está bien. La principal diferencia es que 'os.walk' se repetirá en subdirectorios. – gavinb