¿Cuál es el tamaño de archivo "óptimo" de las imágenes JPEG con respecto a sus dimensiones?

Planeo escribir un script que escaneará más de 100,000 imágenes JPEG y las volverá a comprimir si son "demasiado grandes" en términos de tamaño de archivo. La secuencia de comandos es la parte fácil, pero no estoy seguro de cómo categorizar una imagen como "demasiado grande".

Por ejemplo, hay una imagen de 2400x600px con un tamaño de archivo de 1,81 MB. El comando Guardar para web de Photoshop crea un archivo de 540 KB con una calidad de 60 y las mismas dimensiones. Esto es aproximadamente el 29% del tamaño original.

Ahora estoy pensando en usar estos números como guía. Algo así como 540 KB / (2400 * 600 / 1 000 000) = 375 KB por megapíxel. Cualquier imagen más grande que esta se considera grande. ¿Es este el enfoque correcto o hay uno mejor?

Edición 1: las imágenes deben optimizarse para mostrarse en sitios web.

Edición 2: puedo determinar la calidad de salida deseada experimentando, necesito saber si las imágenes son grandes en términos de tamaño de archivo y dimensiones y deben guardarse en menor calidad.

@xiota, el tamaño del archivo resultante no es importante siempre que esté en algún lugar alrededor de n KB donde no sé exactamente n pero debería ser mucho más bajo que el que tengo actualmente. Planeo usar la misma calidad para todas las imágenes.
¡El primer comentario de xiota debería ser la respuesta! Por cierto, ¿cuál es tu prioridad? si por alguna razón solo necesita archivos pequeños, la calidad puede verse afectada a veces. es fácil crear archivos jpeg irrazonablemente grandes sin una mejora perceptible en la calidad. detectar y recomprimir tales imágenes es una buena idea, simplemente use la configuración de calidad jpeg, como dijo xiota.
@szulat las imágenes fueron creadas por alguien que no sabía que las imágenes deben hacerse más pequeñas para la web (la gente tiende a alejarse de su sitio web si tarda mucho en cargarse). Básicamente, quiero identificar archivos ridículamente grandes que podrían reducirse sacrificando un poco de calidad.
¿"Óptimo" para qué propósito ? Incluso decir 'uso de la web' es un poco amplio en estos días. ¿Los espectadores anticipados verán las imágenes en un teléfono compacto? ¿Un teléfono inteligente más grande? ¿Una tableta o una tableta? ¿Un cuaderno? ¿Un monitor de computadora grande? ¿Un televisor 8K de 60"? ¿Un jumbotron?
Si la secuencia de comandos es la parte fácil, esto es lo que probaría en su situación: establezca un límite definido numéricamente en el que la imagen comprimida pueda diferir del original (por ejemplo, la suma de la diferencia de luminosidad de cada píxel). Comience con una calidad más baja (como 60), exporte y, si la diferencia con el original es demasiado alta, exporte nuevamente con una calidad más alta hasta que se satisfaga su condición de calidad (es posible que deba modificar el cálculo: use una escala exponencial o algo más elegante para obtener el mejor resultado).
@Pavel ¿Por qué intentar reinventar la rueda usando métodos menos eficientes y efectivos? Use un minimizador de JPEG escrito por desarrolladores que entiendan el algoritmo JPEG y usen métricas de comparación de imágenes validadas.
@xiota ¿Por qué no ser constructivo y vincular uno aquí? Yo también agradecería uno, incluso más con algunas "métricas de compresión de imagen validadas", que es exactamente lo que propongo.
@Pavel ¿Cuál es el nombre de la métrica validada que propone? Validado significa que los investigadores probaron el algoritmo en una variedad de contextos, realizaron pruebas AB y compararon el rendimiento con otros algoritmos para asegurarse de que funciona. Frases como "modificar el cálculo" y "algo más sofisticado" indican un enfoque ad hoc (inventarlo sobre la marcha).
@xiota Su respuesta en el primer punto dice exactamente lo mismo que sugiero. "Validado" puede significar "validado para un propósito", que es lo que quiero decir, o "validado científicamente", que es lo que parece querer decir. Creo que le corresponde al OP determinar cuál se adapta mejor a sus necesidades, no a mí; es por eso que sugiero una solución factible y comprobada y me abstengo de emitir juicios absolutos basados ​​​​en mi punto de vista. Le invito a que haga lo mismo (y no hablaré más de esto, ya que está claramente basado en una opinión).
@Pavel Su definición de validado es equivalente a afirmar que una "teoría" es una conjetura sin fundamento. Mucha gente usa la palabra de esa manera, pero eso no es lo que realmente significa. Ya que dices que no discutirás más, no esperaré respuesta.

Respuestas (8)

En promedio , el punto óptimo de JPEG es de alrededor de un bit por píxel .

Por supuesto, esto variará según el contenido de la imagen, porque ciertos tipos de gráficos (por ejemplo, áreas planas y degradados suaves) se comprimen mejor que otros (ruido, texto), por lo que no es un método sólido para aplicar a ciegas a cada imagen.

También tiene el problema de no tener una imagen de referencia sin comprimir con la que comparar, por lo que no sabe con certeza cuál es la calidad actual de las imágenes que tiene y cuánto más puede reducir la calidad para que siga siendo aceptable. La calidad se puede adivinar hasta cierto punto a partir de las tablas de cuantización en los archivos JPEG, pero tampoco es un método confiable (específicamente, el juicio de calidad de ImageMagick es muy incorrecto para los archivos JPEG con tablas de cuantización optimizadas y personalizadas).

Habiendo dicho eso, hay un enfoque práctico razonable:

  1. Elija una configuración de calidad JPEG máxima con la que esté satisfecho (entre 70 y 85).
  2. Vuelva a comprimir las imágenes a ese nivel de calidad.
  3. Si la imagen recomprimida es más pequeña en más de ~10% , conserve la imagen recomprimida.

Es importante no elegir simplemente el tamaño de archivo más pequeño y requerir una reducción significativa en el tamaño del archivo. Esto se debe a que la recompresión de JPEG tiende a disminuir ligeramente el tamaño del archivo debido a la pérdida de detalles causada por la naturaleza con pérdida de JPEG y la conversión a RGB de 8 bits, por lo que las pequeñas caídas en el tamaño del archivo pueden tener una caída de calidad desproporcionadamente grande que no vale la pena. él.

Esto es exactamente lo que hice al final. Usé el bit por píxel como guía para filtrar 30 000 imágenes de más de 100 000 y las volví a comprimir usando imagemagick con una calidad del 85 %. Si la imagen resultante era más de un 50% más pequeña, me quedaba con la nueva. Funcionó en mi caso porque las "imágenes grandes" se crearon usando Photoshop con una calidad del 100%. Las otras más de 70 000 imágenes estaban bien en términos de tamaño de archivo y volver a comprimirlas no generó suficientes ahorros (en términos porcentuales) o hubo una pérdida notable de calidad.
Me gusta tu segundo párrafo, pero ¿tienes algún apoyo para la regla general de un bit por píxel (compresión 24×) con la que lideras?

El tamaño de los archivos comprimidos con JPEG varía según la complejidad de la imagen. Intentar controlar los tamaños de archivo de la manera que usted describe dará como resultado una calidad de imagen percibida muy variable.

Considere las siguientes opciones en su lugar:

  • El enfoque suficientemente bueno.  Utilice una configuración de calidad que le resulte aceptable, como 75. Compare el tamaño del resultado con la imagen original y conserve el archivo más pequeño. Consulte ¿Qué calidad elegir al convertir a JPG?

  • Use un minimizador de JPEG , como JPEGmini o jpeg-recompressde jpeg-archive . Están diseñados esencialmente para hacer lo que parece estar tratando de hacer, pero con más conocimiento de las funciones internas del algoritmo JPEG.

  • Genere miniaturas de varios tamaños , como sugiere Nathancahill , desde la perspectiva de un desarrollador web.

O si quieres ser "extremo" en la minimización de JPEG, guetzli . Tenga en cuenta los requisitos de memoria y tiempo.
Probé guetzli, pero no quedé muy impresionado. Es muy lento y solo reduce tallas en un 20-30%. Con jpeg-recompress, los archivos se pueden reducir en un 80 % con el algoritmo smallfry.

No. Este es un enfoque equivocado.

El tamaño del archivo en píxeles, sí, tiene algo que ver con el peso final, pero no es el único factor.

Haz un examen. Tome un archivo completamente blanco del mismo 2400x600px y guárdelo como JPG.

Ahora tome una foto de un bosque (el mismo 2400x600px) con muchos detalles y guárdela. Este archivo será más grande usando la misma configuración de compresión.

El tamaño final depende de estos 3 factores:

  • Tamaño de píxel
  • Ajustes de compresión
  • Contenido (Detalle y complejidad de la imagen)

Por lo tanto, no puede ni debe definir el peso en función del tamaño del píxel.


Pero entiendo tu problema.

Sin analizar la compresión actual de la imagen, es difícil definir el peso "óptimo" (que es relativo al observador o al uso de las imágenes)

Probablemente pueda definir una configuración de compresión y volver a comprimir "todos ellos". No sé si quieres hacer eso antes de "cargar", lo que probablemente te ahorrará más tiempo que el guardado saltándote algunos de ellos.

Existen algunas herramientas que analizan una imagen y calculan la relación de compresión actual. Pero dudo que sea tan importante.

Entiendo la parte sobre la imagen blanca frente a la imagen del bosque. ¿Sugeriría que tome una muestra aleatoria de imágenes, las vuelva a guardar usando Photoshop (calidad 70) y use la mayor proporción de píxeles: tamaño de archivo como referencia? Supongo que aquellos con una proporción más baja serían aquellos con menos detalles.
Con respecto a tu última frase. La relación de compresión es en realidad más o menos lo que OP está calculando, ya que es jpeg size / raw sizey raw size = pixel size * number of pixel, pixel sizesiendo 3 octetos para un espacio de color RGB de 24 bits. Y como tú mismo dices, esta métrica no es suficiente para determinar si una imagen está lo suficientemente comprimida.
@SalmanA No, le sugiero que abandone este enfoque por completo. Los archivos JPEG son tan grandes como deben ser para brindar la calidad especificada. Su propuesta de ver qué tan grande es la imagen más grande en su muestra con una calidad del 70 % es simplemente elegir un nivel de complejidad de la imagen y decir "Cualquier cosa más compleja que eso es demasiado compleja y se degradará". Sin embargo, si casi todas las imágenes son más pequeñas que este umbral con una calidad del 70 %, ¿cuál es el problema de tener una pequeña cantidad de archivos "demasiado grandes"?
Esto parece corresponder a una conclusión a la que llegué cuando estaba considerando un enfoque para determinar cuál de una serie de imágenes de un tema idéntico pero con diferentes resoluciones y calidad era la imagen "mejor" (por ejemplo, la más cercana al original).

Desarrollador web aquí. Así es como abordaría esto:

1. Determine las dimensiones de la imagen mostrada y las resoluciones de pantalla requeridas.

Su primera tarea es determinar en qué tamaño de píxel se mostrarán las imágenes. ¿Son fotos de productos en una tienda online? ¿Una galería de fotos? Fotos de perfil de usuario? Múltiples tamaños diferentes? Haz una lista de las dimensiones en píxeles que necesitarás. Compruebe si necesitará imágenes @2x para pantallas de alta resolución como teléfonos y tabletas recientes.

2. Utilice un script de miniaturas para crear nuevos archivos de imagen.

Estos se denominan secuencias de comandos de miniaturas, pero se pueden usar para mucho más que solo miniaturas. Hay muchos guiones por ahí o puedes escribir el tuyo propio. Al no cambiar el tamaño de los archivos originales, puede volver a hacerlo si comete un error en su secuencia de comandos o se da cuenta de que necesita una imagen de mayor resolución. Una práctica común es especificar un sufijo en el nombre del archivo de salida. Por ejemplo:

lena.jpg (Original, 2000x3000)
lena-thumb.jpg (100x150)
lena-thumb@2x.jpg (200x300)
lena-product.jpg (400x600)
lena-product@2x.jpg (800x1200)

3. Comprimir.

La secuencia de comandos en miniatura debe especificar la compresión jpg cuando corte los nuevos archivos de imagen. Sin embargo, existen otros minificadores que podrían reducir aún más el tamaño del archivo.

Así es como se manejará esto en el futuro: solicite a los fotógrafos que coloquen los originales de alta resolución en un directorio, luego use un script para generar tamaños más pequeños (miniaturas de varios tamaños y más grandes para escritorio y dispositivos móviles) y colóquelos en www con url reescribiendo Pero ahora mismo no tengo acceso a los originales.

Si bien la respuesta de @Rafael ha explicado la compresión JPEG por dentro y por fuera, intentaré responder a su web y subir problemas.

El uso de una imagen en un sitio web (para diseño o contenido) dictará algunos imperativos: ¿para qué se utilizará mi imagen? Logotipo, foto de portada, miniatura, foto en una publicación de blog, foto de pantalla completa para una galería... Además, si la usa para múltiples propósitos (por ejemplo, una foto y su miniatura de la galería), desea rechazarla en todos los tamaños requeridos. Sin embargo, a menos que esté creando su propio sitio web, la mayoría de los servicios web actuales generarán imágenes de tamaño más pequeño a partir de su imagen más grande para usar en el sitio.

Ahora que conoce el propósito de su imagen, el sitio web (o CMS o Framework front-end) siempre requerirá un tamaño máximo en píxeles para que su imagen cumpla. Los logotipos pueden tener un máximo de 600 x 600 px, la cubierta de fondo puede tener un máximo de 1280 x 720 px, la foto de contenido para visualización en pantalla completa de 1920 x 1080 o la resolución nativa de la cámara para una conservación absoluta de los detalles. Verifique el tamaño correcto del sitio web al que desea cargar. Desea hacer coincidir al menos uno del tamaño máximo de píxel requerido, según la proporción que desee lograr. Tenga cuidado, algunos servicios recortarán y estirarán su imagen si la relación de aspecto no es la misma. En ese caso, tendrá que volver a recortar la imagen para que se ajuste al tamaño y la proporción máximos requeridos.

Luego, el sitio web puede imponer un límite de tamaño de archivo (o no, según el propósito de la imagen). En cuanto al tiempo de carga de la página, cuanto más ligero mejor. En su ejemplo de una imagen de alta resolución a 2400x600px, 300 a 500kB es un tamaño totalmente adecuado para el tiempo de carga. Las imágenes de contenido (como fotos) pueden ser más pesadas si el propósito de la imagen lo requiere (por ejemplo, visualización de pantalla completa), hasta la resolución nativa de su cámara si es necesario. Si no se da ninguna indicación, el límite de tamaño de archivo puede ser difícil de adivinar, ya que puede depender del equipo de la audiencia (móvil, de escritorio...), la calidad de la red del país de la audiencia... Para obtener la máxima calidad y servicio, trate las fotos una por una para obtenga el tamaño de archivo mínimo sin artefactos visibles. Para mayor comodidad o velocidad de procesamiento, cambie el tamaño de la secuencia de comandos utilizando un nivel de compresión general satisfactorio (alrededor de 70 debería estar bien).La respuesta de @xiota también podría ser la herramienta que necesitas. Establezca su propio estándar aquí.

TL; DR , el propósito de la imagen en el sitio web es clave para la cantidad de tamaño/compresión.

Lo que está calculando es el tamaño comprimido promedio de un píxel de imagen, si lo divide por el tamaño de píxel sin procesar (generalmente 3 octetos para un RGB de 24 bits), obtiene la relación de compresión.

Esta es una buena métrica que te brinda información sobre el estado de compresión de la imagen, pero no es suficiente para juzgar si la imagen está lo suficientemente comprimida o no porque la relación de compresión no depende solo del perfil de compresión (algoritmo = JPEG, calidad = 60/100), sino también en el potencial de compresión de la imagen: diferentes imágenes con el mismo tamaño bruto y el mismo perfil de compresión producirán diferentes tamaños jpeg porque las imágenes son más o menos fáciles de comprimir (una imagen en blanco es muy fácil de comprimir, blanco el ruido no lo es).

Debido a esto y a que el perfil de calidad de "último uso" no se almacena en esta imagen (ni en los metadatos ni en la estructura del encabezado jpeg), el enfoque más utilizado cuando se vuelven a publicar imágenes con un perfil de calidad/tamaño de destino es simplemente volver a comprimir ( y potencialmente cambiar el tamaño) todo (automáticamente) independientemente del estado inicial de la imagen.

Sí, puede volver a comprimir cuando no sea necesario, sí, incluso puede perder espacio si vuelve a comprimir con un perfil de mayor calidad, pero esos son casos extremos y, a gran escala, es lo más fácil de hacer para garantizar un perfil de calidad objetivo. Por supuesto, solo querrá hacer eso una vez para no degradar gradualmente las imágenes, y probablemente debería almacenar dos bibliotecas de imágenes: la inicial "sin tocar" y la "para ser publicada/recomprimida".

Hay muchas herramientas que existen para volver a comprimir un montón de archivos, también puede crear su propia secuencia de comandos y usar la pila técnica correcta (C ++ y libjpeg principalmente) puede ser bastante rápido incluso para archivos> 100k.

Si desea implementar un proceso más inteligente/complejo, puede intentar experimentar con una lógica iterativa de recompresión/comparación de tamaño para estimar el perfil de calidad original (la recompresión con la misma calidad debería producir aproximadamente el mismo tamaño, con un alto calidad debe aumentar ligeramente el tamaño y con una calidad inferior debe disminuir significativamente el tamaño). Esto, por supuesto, consumiría mucha más potencia de CPU.

Las imágenes JPG suelen submuestrear el croma con 4:2:2 o 4:2:0 ( en.wikipedia.org/wiki/Chroma_subsampling#4:2:2 ), por lo que los píxeles "en bruto" que JPG está comprimiendo tienen 2x o 4 veces más píxeles de luminancia que cada canal de croma. (Reducido a la mitad horizontalmente y tal vez también verticalmente). Es posible que desee tener eso en cuenta al considerar "qué tan comprimida" está una imagen. Pero sí, como dices, esa no es una gran métrica en contenidos de imágenes desconocidos.
+1 para reescalar. En algún momento, obtiene una mejor calidad de imagen al reducir la escala que al reducir aún más los bits por píxel. A diferencia de los códecs de video modernos como h.264 o h.265 (que pueden indicarle al decodificador que haga más suavizado y desbloqueo) o la versión de imagen fija, HEIF, que es un I-frame HEVC (h.265) , JPEG no No tiene nada de eso y se bloqueará con muchos artefactos de timbre si lo privas de bits. Por lo tanto, debe reducir la escala en lugar de solo reducir la calidad si tiene imágenes de entrada de muy alta resolución.
For example there is a 2400x600px image with a file size of 1.81MB.
Photoshop's save for web command creates a 540KB file at 60 quality and same dimensions.    
This is about 29% of original size.

El tamaño original sin comprimir es 2400 x 600 x 3 = 4 320 000 bytes (4,1 MB), porque el color de 24 bits siempre es tres bytes de datos RGB por píxel . No hay forma de evitar esta verdad absoluta.

Sin embargo, el tamaño de JPG también depende del detalle de la imagen. Las áreas uniformes grandes (como el cielo o las paredes pintadas) se comprimen mejor, pero las áreas con mayor detalle (como un árbol lleno de hojas) no se comprimen tan bien. Así que no hay un indicador numérico absoluto.

Pero 540 KB es 0.540/4.1 = 13% del tamaño original de 4.1 MB . Puede ser el 29 % del tamaño JPG anterior, pero es el 13 % del tamaño original sin comprimir. Eso es 1/8 del tamaño original sin comprimir, que generalmente se considera de calidad "decente". No es de calidad óptima, no máxima, pero generalmente decente, tal vez lo suficientemente bueno para algunos usos. Solo digo que ya es pequeño.

Un archivo JPG más grande tiene una mejor calidad de imagen y un archivo JPG más pequeño tiene una calidad de imagen menor. Tienes que decidir qué es lo suficientemente bueno, pero JPG nunca es "demasiado grande", ya que la calidad de la imagen disminuye con la compresión de JPG. El color de 24 bits tiene tres bytes por píxel sin comprimir.

Así que la decisión es si lo quieres pequeño o si lo quieres bueno.

Pero agrandar un JPG existente es aún peor, ya que se agregan más artefactos JPG y, una vez pequeños, los datos cambian y nunca mejorarán.

Los artefactos JPG generalmente se muestran de dos formas, como bloques visibles de 8x8 píxeles de un color en las áreas uniformes sin detalles, o como bordes ásperos visibles alrededor de los bordes de los detalles.

Si edita y vuelve a guardar un JPG, se agregan artefactos JPG adicionales. Si es necesario, es una buena práctica volver a guardar siempre para que coincida con la configuración de compresión original.

El número de 4,1 MB solo es cierto si no hay ninguna compresión; sin embargo, incluso un archivo JPEG con una calidad perfecta puede tener un tamaño de archivo más pequeño debido a la compresión sin pérdidas .
Sí, por eso lo llamé "sin comprimir", que es como comienza cada imagen digital, que por supuesto es el tamaño real y original de los datos, por eso es importante. Sí, incluso el JPG 100 de más alto nivel se comprime mucho más pequeño, no sin pérdidas. JPG sin pérdida es un nombre inapropiado. No tenemos programas que lo ofrezcan. Sus usos lo llaman de otra manera (Wikipedia dice DNG y algo Raw). Sin embargo, JPEG2 puede ofrecer compresión sin pérdidas, pero tiene otros problemas, por ejemplo, los navegadores web no admiten la visualización de JPEG2 y es probable que las tiendas de impresión fotográfica no lo acepten.
No hay forma de evitar esta verdad absoluta. ... a excepción del submuestreo de croma, que utiliza JPEG. JPEG se comprime en el espacio de color YUV (brillo + dos componentes de color), no en RGB. Por lo general, 4:2:2 o 4:2:0, lo que reduce el número de píxeles en cada uno de los dos canales de croma en 2x o 4x. en.wikipedia.org/wiki/Chroma_subsampling#4:2:2 . Después de la transformación de RGB a YUV y el submuestreo, esa información de resolución de color desaparece por completo y no es parte de lo que JPEG está gastando bits para codificar. Si desea ver bits/píxel, debe estar en el formato de color del JPEG que está considerando.
Vamos, lee el texto. La segunda verdad absoluta es que específicamente dijo y se refirió a "sin comprimir" y dijo que el color de 24 bits siempre fue de tres bytes por píxel. :)

"Guardar para la web" de Photoshop es en realidad un compromiso bastante bueno entre el tamaño y la calidad del archivo, por lo que, a menos que tenga requisitos más específicos, debe aceptarlo. Un consejo típico para los desarrolladores web es ceñirse al rango de calidad del 50-70%. Por supuesto, hay excepciones: deseará una calidad del 90-95 % en el logotipo de una empresa que tiene que verse bien en todo momento (o incluso convertirlo a un formato sin pérdidas), y bajar hasta el 30 % en un logotipo grande pero apenas fondo de página visible.

Además, no olvides cambiar la escala de tus imágenes. Una imagen de 2400x600 se verá muy bien en una pantalla 4K, pero se volverá a escalar en pantallas más pequeñas, desperdiciando ancho de banda de datos sin ninguna mejora visual para el usuario. Verifique la plantilla del sitio web que usará para averiguar el ancho óptimo para las imágenes. Por lo general, en el momento de escribir este artículo, estará entre 1200 y 1300 píxeles (consulte la resolución más popular aquí ).

Recuerde conservar los originales de las imágenes que convierta a calidad Web. Si alguna vez necesita volver a trabajar o imprimir este material, se arrepentirá de tenerlo solo en una calidad del 60% y una resolución de 1 Mpix.