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

10

Planeo escribir un script que escanee más de 100,000 imágenes JPEG y las vuelva 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 clasificar una imagen como "demasiado grande".

Por ejemplo, hay una imagen de 2400x600px con un tamaño de archivo de 1.81MB. 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 / (2,400 * 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 su visualización 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 una calidad inferior.

Salman A
fuente
1
¡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 ganancia perceptible de calidad. detectar y recomprimir tales imágenes es una buena idea, simplemente use la configuración de calidad jpeg, como dijo xiota.
szulat
18
¿"Óptimo" para qué propósito ? Incluso decir 'uso web' es un poco amplio en estos días. ¿Los espectadores anticipados van a mirar las imágenes en un teléfono compacto? ¿Un teléfono inteligente más grande? ¿Una almohadilla o tableta? ¿Un cuaderno? ¿Un monitor de computadora grande? ¿Un televisor 8K de 60 "? ¿Un jumbotron?
Michael C
2
Posible duplicado de ¿Qué calidad elegir al convertir a JPG?
Hueco
2
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 se permita que la imagen comprimida difiera del original (por ejemplo, la suma de la diferencia de luminosidad de cada píxel). Comience con una calidad inferior (como 60), exporte, y si la diferencia con el original es demasiado alta, exporte nuevamente con mayor calidad hasta que se cumpla su condición de calidad (es posible que deba ajustar el cálculo; use una escala exponencial o algo más elegante para obtener El mejor resultado).
Pavel

Respuestas:

4

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 gradientes suaves) se comprimen mejor que otros (ruido, texto), por lo que no es un método robusto para aplicar a ciegas a cada imagen.

También tiene el problema de no tener una imagen de referencia sin comprimir para comparar, por lo que realmente 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 aún sea aceptable. La calidad se puede adivinar en cierta medida de las tablas de cuantificación en JPEG, pero tampoco es un método confiable (específicamente, el criterio de calidad de ImageMagick es muy incorrecto para JPEG con tablas de cuantización personalizadas y optimizadas).

Dicho esto, hay un enfoque práctico razonable:

  1. Elija una configuración de calidad JPEG máxima con la que esté satisfecho (en algún lugar dentro del rango de 70 a 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% , mantenga la imagen recomprimida.

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

Kornel
fuente
44
Esto es exactamente lo que hice al final. Utilicé un bit por píxel como guía para filtrar 30,000 imágenes de 100,000+ y las comprimí de nuevo usando imagemagick con 85% de calidad. Si la imagen resultante era más de un 50% más pequeña, me quedé con la nueva. Funcionó en mi caso porque las "imágenes grandes" se crearon con Photoshop con un 100% de calidad. Las otras más de 70,000 imágenes fueron correctas en términos de tamaño de archivo y volver a comprimirlas no generó suficientes ahorros (porcentaje) o hubo una pérdida notable de calidad.
Salman A
1
Me gusta su segundo párrafo, pero ¿tiene algún soporte para la regla práctica de un bit por píxel (compresión 24 ×) con la que lidera?
Lea mi perfil el
30

El tamaño de los archivos comprimidos con JPEG varía según la complejidad de la imagen. Probar el control de 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 lo suficientemente bueno.  Use una configuración de calidad que considere aceptable, como 75. Compare el tamaño del resultado con la imagen original y mantenga el archivo más pequeño. ¿ Ver qué calidad elegir al convertir a JPG?

  • Use un minimizador de JPEG , como JPEGmini o jpeg-recompressde jpeg-archive . Básicamente están diseñados para hacer lo que parece que estás tratando de hacer, pero con más conocimiento de los aspectos internos del algoritmo JPEG.

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

xiota
fuente
77
O si quieres ir "extremo" en la minimización de JPEG, guetzli . Tenga en cuenta los requisitos de memoria y tiempo.
Philip Kendall el
2
Probé guetzli, pero no me impresionó mucho. Es muy lento y solo reduce los tamaños en aproximadamente un 20-30%. Con jpeg-recompress, los archivos se pueden reducir en un 80% con el algoritmo smallfry.
xiota
18

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 (mismo 2400x600px) con muchos detalles y guárdelo. Este archivo será más grande con 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 de 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". No sé si quieres hacer eso antes de "subir", lo que probablemente te ahorrará más tiempo que el guardado omitiendo 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.

Rafael
fuente
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 relación píxel: tamaño de archivo como referencia? Supongo que aquellos con una relación más baja serían aquellos con menos detalles.
Salman A
En cuanto 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 usted mismo dice, esta métrica no es suficiente para determinar si una imagen está suficientemente comprimida.
zakinster
99
@SalmanA No, te sugiero que abandones este enfoque por completo. Los archivos JPEG son tan grandes como deben ser para dar la calidad especificada. Su propuesta de ver qué tan grande es la imagen más grande en su muestra con un 70% de calidad es simplemente elegir un nivel de complejidad de 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"?
David Richerby el
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).
Michael
10

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 en línea? ¿Una galería de fotos? ¿Fotos de perfil de usuario? Múltiples tamaños diferentes? Haga una lista de las dimensiones en píxeles que necesitará. Compruebe si necesitará imágenes @ 2x para pantallas de alta resolución, como teléfonos y tabletas recientes.

2. Use un script en miniatura para crear nuevos archivos de imagen.

Estos se llaman scripts en miniatura, pero se pueden usar para mucho más que solo miniaturas. Hay muchos guiones por ahí o puedes escribir el tuyo. Al no cambiar el tamaño de los archivos originales, puede hacerlo si comete un error en su secuencia de comandos o se da cuenta en el futuro 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)
[email protected] (200x300)
lena-product.jpg (400x600)
[email protected] (800x1200)

3. Comprimir.

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

nathancahill
fuente
Así es como manejará esto en el futuro: solicite a los fotógrafos que coloquen 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 debajo de www con url reescritura Pero en este momento no tengo acceso a los originales.
Salman A
6

Si bien la respuesta de @ Rafael ha explicado las entradas y salidas de compresión JPEG, intentaré responder a su web y cargar problemas.

Usar una imagen en un sitio web (para diseño o contenido) dictará algunos imperativos: ¿para qué se usará 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 la miniatura de su galería), debe 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 menor tamañ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 ser 600x600px máx., La cubierta de fondo puede ser 1280x720px máx., La foto de contenido para pantalla completa 1920x1080 o la resolución nativa de la cámara para la conservación de detalles absolutos. Verifique el tamaño correcto del sitio web al que desea subir. Desea igualar al menos el tamaño de píxel máximo requerido, dependiendo de la proporción que desea 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 su imagen para que se ajuste al tamaño y la relación máximos requeridos.

Luego, el sitio web puede imponer un límite de tamaño de archivo (o no, dependiendo del 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 fino 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, pantalla completa), hasta la resolución nativa de su cámara si es necesario. Si no se proporciona ninguna indicación, el límite de tamaño del archivo puede ser difícil de adivinar, ya que puede depender del equipo de la audiencia (móvil, computadora de escritorio ...), la calidad de la red del país de la audiencia ... Para obtener la máxima calidad y servicio, trate la foto una por una para obtener el tamaño mínimo de archivo sin artefactos visibles. Para mayor comodidad o velocidad de procesamiento, cambie el tamaño del script utilizando un nivel de compresión satisfactorio general (alrededor de 70 debería estar bien).La respuesta de @xiota también podría ser la herramienta que necesita. Establezca su propio estándar aquí.

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

jihems
fuente
3

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 le brinda información sobre el estado de compresión de la imagen, pero no es suficiente para juzgar si la imagen está suficientemente comprimida o no porque la relación de compresión no depende solo del perfil de compresión (algoritmo = JPEG, calidad = 60/100) pero también en el potencial de compresión de la imagen: diferentes imágenes con el mismo tamaño sin procesar y el mismo perfil de compresión producirán diferentes tamaños de 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 es).

Debido a esto y porque el perfil de calidad "utilizado por última vez" no se almacena en esta imagen (ni en la estructura de metadatos o encabezado jpeg), el enfoque más utilizado al volver a publicar imágenes con un perfil de tamaño / calidad objetivo es en realidad volver a comprimir (y potencialmente redimensionar) 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, en gran escala, es lo más fácil de hacer para garantizar un perfil de calidad objetivo. Por supuesto, solo desea hacer eso una vez para no degradar gradualmente las imágenes, y probablemente debería almacenar dos bibliotecas de imágenes: la inicial "intacta" y la "para ser publicado / recomprimido".

Existen muchas herramientas para volver a comprimir un montón de archivos, también puede crear su propio script y usar la pila técnica correcta (C ++ y libjpeg en su mayoría) 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 compresión / comparación de tamaños para estimar el perfil de calidad original (volver a comprimir con la misma calidad debería producir aproximadamente el mismo tamaño, con un alto la calidad debería aumentar ligeramente el tamaño y con una calidad inferior debería disminuir significativamente el tamaño). Esto, por supuesto, consumiría mucha más potencia de CPU.

zakinster
fuente
Las imágenes JPG generalmente submuestrean 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 4x tantos píxeles de luma como cada canal de croma. (Reducido a la mitad horizontalmente y quizás también verticalmente). Es posible que desee tener eso en cuenta al considerar "cuán comprimida" está una imagen. Pero sí, como dices, esa no es una gran métrica para contenidos de imágenes desconocidos.
Peter Cordes
+1 para reescalar. En algún momento, obtienes una mejor calidad de imagen reduciendo la escala que reduciendo 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 marco I HEVC (h.265) , JPEG no ' No tengo nada de eso y simplemente se bloqueará con muchos artefactos sonando si lo mueres de hambre. Por lo tanto, debe reducir la escala en lugar de simplemente reducir la calidad si tiene imágenes de entrada de muy alta resolución.
Peter Cordes
2
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 es siempre 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 grandes y lisas (como el cielo o las paredes pintadas) se comprimen mejor, pero las áreas de mayor detalle (como un árbol lleno de hojas) no se comprimen también. Entonces 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 calidad "decente". No es óptimo, no tiene la máxima calidad, pero en general es decente, tal vez lo suficientemente bueno para algunos usos. Solo digo que ya es pequeño.

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

Entonces la decisión es si lo quieres pequeño o si lo quieres bien.

Pero hacer que un JPG existente sea más grande 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 muestran dos formas, como bloques visibles de 8x8 píxeles de un color en las áreas lisas sin detalles, o como bordes ásperos visibles alrededor de los bordes de 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.

WayneF
fuente
El número de 4.1 MB solo es verdadero si no hay compresión, sin embargo, incluso un JPEG con una calidad perfecta puede tener un tamaño de archivo más pequeño debido a la compresión sin pérdidas .
Marv
Sí, por eso lo llamé "sin comprimir", que es cómo comienza cada imagen digital, que es, por supuesto, el tamaño real y original de los datos, y por eso es importante. Sí, incluso el nivel más alto JPG 100 se comprime sustancialmente 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 algo más (Wikipedia dice DNG y algunos Raw). Sin embargo, JPEG2 puede ofrecer una compresión sin pérdidas, pero tiene otros problemas, por ejemplo, los navegadores web no admiten mostrar JPEG2, y las tiendas de impresión de fotografías probablemente no lo acepten.
WayneF
No hay forma de evitar esta verdad absoluta. ... excepto para el submuestreo de croma, que utiliza JPEG. JPEG comprime en espacio de color YUV (brillo + dos componentes de color), no 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 desapareció por completo, y no es parte de lo que JPEG está gastando para codificar. Si desea ver bits / píxel, debe estar en el formato de color del JPEG que está considerando.
Peter Cordes
2
Vamos, lee el texto. La segunda verdad absoluta es que dijo específicamente y se refirió a "sin comprimir" y dijo que el color de 24 bits siempre era de tres bytes por píxel. :)
WayneF
0

El "Guardar para 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 ir con eso. Un consejo típico para los desarrolladores web es mantener un rango de calidad del 50-70%. Por supuesto, hay excepciones: querrá un 90-95% de calidad en el logotipo de una empresa que debe verse bien en todo momento (o incluso convertirlo a un formato sin pérdidas), y llegar hasta un 30% en un tamaño grande pero apenas Fondo de página visible.

Tampoco olvides reescalar tus imágenes. Una imagen de 2400x600 se verá genial en una pantalla 4K, pero se redimensionará en pantallas más pequeñas, desperdiciando el ancho de banda de datos sin ninguna mejora visual para el usuario. Consulte la plantilla del sitio web que utilizará para averiguar el ancho óptimo para las imágenes. Por lo general, en el momento de escribir esto será de alrededor de 1200-1300 píxeles (vea 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, lamentará tenerlo solo en un 60% de calidad y una resolución de 1 Mpix.

Dmitry Grigoryev
fuente