Entiendo que puede obtener el tamaño de la imagen usando PIL de la siguiente manera
from PIL import Image
im = Image.open(image_filename)
width, height = im.size
Sin embargo, me gustaría obtener el ancho y el alto de la imagen sin tener que cargar la imagen en la memoria. ¿Es eso posible? Solo estoy haciendo estadísticas sobre tamaños de imágenes y no me importa el contenido de la imagen. Solo quiero que mi procesamiento sea más rápido.
python
image
image-processing
Sami A. Haija
fuente
fuente
.open()
lea todo el archivo en la memoria ... (eso es lo que.load()
) hace, hasta donde yo sé, esto es tan bueno como se usaPIL
pmap
para monitorear la memoria utilizada por un proceso me muestra que, de hechoPIL
, no carga la imagen completa en la memoria.Respuestas:
Como aluden los comentarios, PIL no carga la imagen en la memoria al llamar
.open
. Mirando los documentos dePIL 1.1.7
, la cadena de documentos para.open
dice:Hay algunas operaciones de archivo en la fuente como:
pero estos difícilmente constituyen la lectura de todo el expediente. De hecho,
.open
simplemente devuelve un objeto de archivo y el nombre de archivo en caso de éxito. Además, los documentos dicen:Profundizando, vemos que las
.open
llamadas_open
son una sobrecarga específica del formato de imagen. Cada una de las implementaciones_open
se puede encontrar en un nuevo archivo, por ejemplo. Los archivos .jpeg están en formatoJpegImagePlugin.py
. Veamos eso en profundidad.Aquí las cosas parecen ponerse un poco complicadas, hay un bucle infinito que se rompe cuando se encuentra el marcador jpeg:
Lo que parece que podría leer todo el archivo si estuviera mal formado. Sin embargo, si lee bien el marcador de información, debería aparecer temprano. La función determina en
handler
última instanciaself.size
cuáles son las dimensiones de la imagen.fuente
open
obtiene el tamaño de la imagen o también es una operación perezosa? Y si es perezoso, ¿lee los datos de la imagen al mismo tiempo?Docs/PIL.Image.html
..jpeg
formato parece correcto siempre que se encuentre el encabezado.Si no le importa el contenido de la imagen, PIL probablemente sea una exageración.
Sugiero analizar la salida del módulo mágico de Python:
Se trata de un contenedor de libmagic que lee la menor cantidad de bytes posible para identificar una firma de tipo de archivo.
Versión relevante del script:
https://raw.githubusercontent.com/scardine/image_size/master/get_image_size.py
[actualizar]
Parece que los JPEG son resistentes a la magia. :-)
Puedo ver por qué: para obtener las dimensiones de la imagen para archivos JPEG, es posible que deba leer más bytes de los que le gusta leer a libmagic.
Me arremangué y vino con este fragmento sin probar (obténgalo de GitHub) que no requiere módulos de terceros.
[actualización 2019]
Consulte una implementación de Rust: https://github.com/scardine/imsz
fuente
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x89 in position 0: invalid start byte
en MacOS, python3 endata = input.read(25)
,file
en imágenes daPNG image data, 720 x 857, 8-bit/color RGB, non-interlaced
Hay un paquete en pypi llamado
imagesize
que actualmente funciona para mí, aunque no parece que esté muy activo.Instalar en pc:
Uso:
Inicio: https://github.com/shibukawa/imagesize_py
PyPi: https://pypi.org/project/imagesize/
fuente
A menudo busco tamaños de imágenes en Internet. Por supuesto, no puede descargar la imagen y luego cargarla para analizar la información. Consume demasiado tiempo. Mi método es alimentar fragmentos a un contenedor de imágenes y probar si puede analizar la imagen cada vez. Detenga el ciclo cuando obtenga la información que quiero.
Extraje el núcleo de mi código y lo modifiqué para analizar archivos locales.
Salida:
El tamaño real del archivo es 1,543,580 bytes y solo lee 38,912 bytes para obtener el tamaño de la imagen. Espero que esto ayude.
fuente
Otra forma corta de hacerlo en sistemas Unix. Depende de la salida de la
file
que no estoy seguro si está estandarizada en todos los sistemas. Esto probablemente no debería usarse en código de producción. Además, la mayoría de los archivos JPEG no informan del tamaño de la imagen.fuente
IndexError: list index out of range
Esta respuesta tiene otra buena resolución, pero falta el formato pgm . Esta respuesta ha resuelto el pgm . Y agrego el bmp .
Los códigos están debajo
fuente
imghdr
sin embargo, maneja ciertos jpegs bastante mal.