Estoy tratando de encontrar un método realmente rápido para determinar las dimensiones de una imagen.
Sé que podría mover la imagen y luego usar imagemagick para determinar la altura y el ancho de la imagen. Me preocupa que esta no sea la forma más rápida de hacerlo.
También me preocupa tener que instalar imagemagick cuando solo necesito un subconjunto muy pequeño de funcionalidad. Estoy en un sistema integrado que tiene recursos muy limitados (CPU, RAM, almacenamiento).
¿Algunas ideas?
bash
wget
imagemagick
exvance
fuente
fuente
Respuestas:
Como observa, no necesita todo el paquete ImageMagick . Sólo se necesita
identify
.También necesitará las bibliotecas a las que se vincula el ejecutable (y las bibliotecas a las que se vinculan esas bibliotecas).
ldd
mostrará una lista Cuando hice esto, incluía algunas bibliotecas X, libjpeg, etc. y dos bibliotecas claramente del paquete ImageMagick,libMagickCore
ylibMagickWand
. Esos parecen estar vinculados al mismo grupo de cosas, así que si tienes eso,identify
debería funcionar.No tiene que descargar una imagen completa para obtener las dimensiones, ya que están en un encabezado al comienzo del archivo y eso es lo que se
identify
ve. Por ejemplo, aquí estoy copiando los primeros 4 kB de un archivo JPEG completo en un nuevo archivo:4 kB deberían ser más que suficientes para incluir el encabezado; estoy seguro de que podría hacerlo con 1/4 de esa cantidad. Ahora:
Esas son las dimensiones correctas para
real.jpg
. Sin embargo, tenga en cuenta que el tamaño (4.1 KB) es el tamaño del archivo truncado, ya que esa información no proviene del encabezado de la imagen.Entonces: solo tiene que descargar el primer kilobyte de cada imagen.
fuente
Puede usar
curl
para descargar partes de la imagen. Todo depende de cuán robusto tenga que ser. Un caso de prueba podría ser los primeros 500 bytes. Parece funcionar por mucho tiempopng
yjpg
luego usaridentify
o algo similar para verificar el tamaño.Editar:
Hace mucho tiempo que escribí analizadores de imágenes, pero lo pensé y refresqué parte de mi memoria.
Sospecho que es todo tipo de imágenes que desea verificar (pero, de nuevo, tal vez no). Voy a describir algunos de los más comunes:
PNG
,JPEG
(JFIF) yGIF
.PNG:
Estos son simples cuando se trata de extracción de tamaño. Un
png
encabezado almacena el tamaño dentro de los primeros 24 bytes. Primero viene un encabezado fijo:Luego viene fragmentos a través del archivo. Consisten en un campo fijo de longitud, tipo y suma de verificación. Además, una sección de datos opcional de tamaño de longitud .
Afortunadamente, el primer fragmento siempre es un
IHDR
con este diseño:Por esto tenemos que los tamaños son byte 16-20 y 21-24. Puede volcar los datos, por ejemplo, hexdump:
En una máquina Big Endian / Motorola, también se pueden imprimir los tamaños directamente:
Sin embargo, en Little Endian / Intel, no es tan fácil y tampoco es muy portátil.
Con esto, podríamos implementar un script bash + hexdump como en:
Pero, esto no es directamente eficiente. Aunque requiere una porción mayor (75-100 bytes),
identify
es bastante más rápido. O escriba la rutina en, por ejemplo, C, que sería más rápido que las llamadas a la biblioteca.JPEG:
Cuando se trata de
jpg
eso, no es tan fácil. También comienza con un encabezado de firma , pero el tamaño del fragmento no está en un desplazamiento fijo. Después del encabezado:aparece un nuevo bloque especificado por un marcador de dos bytes que comienza con
0xff
. El que contiene información sobre las dimensiones tiene el valor,0xffc0
pero puede ocultarse un poco por debajo de los datos.En otras palabras, omitir bytes de tamaño de bloque , marcar marcador, omitir bytes de tamaño de bloque , leer marcador, etc. hasta que aparezca el correcto.
Cuando se encuentran, los tamaños se almacenan en dos bytes cada uno en el desplazamiento 3 y 5 después del marcador .
Escribió un programa en C simple para verificar algunos archivos y de aproximadamente 10,000 imágenes jpg, aproximadamente el 50% tenía la información de tamaño dentro de los primeros 500 bytes, principalmente el 50% entre ca. 100 y 200. Lo peor fue alrededor de 80,000 bytes. Una foto, mientras hablamos fotos:
GIF:
Aunque el GIF generalmente puede tener múltiples imágenes almacenadas, tiene un tamaño de lienzo especificado en el encabezado, esto es lo suficientemente grande como para albergar las imágenes. Es tan fácil como con PNG , y requiere incluso bytes de fiebre: 10. Después de la magia y la versión, encontramos tamaños. Ejemplo de una imagen de 364x472:
En otras palabras, puede verificar los primeros seis bytes para ver si es un gif, luego leer los siguientes cuatro para ver los tamaños.
Otros formatos:
Podría haber continuado, pero supongo que me detengo aquí por ahora.
fuente
Asume que tienes "identificar". Pon esto en un guión y
chmod +x <scriptname>
. Para ejecutarlo, escriba<scriptname> picture.jpg
y obtendrá el alto y el ancho de la imagen. Las primeras 2 secciones son para verificar si hay una imagen y luego configurarla como la variable IMAGEN. La siguiente sección es asegurarse de que el archivo esté realmente allí. Las últimas 2 secciones son para tomar la información relevante de la salida 'identificar' y mostrarla.fuente
file command
se instala por defecto en los distorsores y solo depende de:Creo que puedes instalarlo fácilmente para incrustarlo. Simplemente escribe un
regular expression
para su salida.fuente
file
no da dimensiones para, por ejemplo,.jpg
archivos.Reemplazas
file://
conhttp://
fuente