Pregunta

Esta es realmente una pregunta de dos partes, ya que todavía no entiendo completamente cómo funcionan estas cosas:

Mi situación: estoy escribiendo una aplicación web que permite al usuario subir una imagen. Mi aplicación luego cambia de tamaño a algo mostrable (por ejemplo: 640x480-ish) y guarda el archivo para su uso más adelante.

Mis preguntas:

  1. Dado un archivo JPEG arbitrario, ¿es posible saber cuál es el nivel de calidad, para que pueda usar esa misma calidad al guardar la imagen redimensionada?
  2. ¿Esto importa? ¿Debería guardar todas las imágenes en un nivel decente (por ejemplo: 75-80), independientemente de la calidad original?

No estoy tan seguro de esto porque, como lo imagino: (tomemos un ejemplo extremo), si alguien tuviera una imagen de 5 megapíxeles guardada en la calidad 0, sería bloqueado como cualquier cosa. Reduciendo el tamaño de la imagen a 640x480, el bloqueo se suavizaría y apenas menos notable ... hasta que lo guardé con calidad 0 nuevamente ...

En el otro extremo del espectro, si había una imagen que era 800x600 con Q = 0, cambiar el tamaño de 640x480 no va a cambiar el hecho de que parece una basura total, por lo que guardar con Q = 80 sería redundante.

¿Estoy incluso cerca?

Estoy usando la biblioteca GD2 en PHP si eso es de algún uso

¿Fue útil?

Solución

  1. JPEG es un formato con pérdida. Cada vez que guarde una misma imagen JPEG, independientemente del nivel de calidad, reducirá la calidad de imagen real. Por lo tanto, incluso si obtuvo un nivel de calidad del archivo, no podría mantener esa misma calidad cuando guarde un JPEG nuevamente (incluso en calidad = 100).

  2. Debe guardar su JPEG con una calidad tan alta como pueda pagar en términos de tamaño del archivo. O use un formato sin pérdidas como PNG.

Los archivos JPEG de baja calidad no se vuelven más bloqueados. En cambio, se reduce la profundidad de color y se eliminan los detalles de las secciones de la imagen. No puede confiar en que las imágenes de menor calidad sean bloqueadas y se vean bien en tamaños más pequeños.

De acuerdo con la JFIF Spec. El número de calidad (0-100) no se almacena en el encabezado de la imagen, aunque se almacena la densidad de píxeles horizontal y vertical.

Otros consejos

Puede ver el nivel de compresa por ImageMagick. Las instrucciones de descarga e instalación se pueden encontrar en el página web oficial.

Después de instalarlo, ejecute el siguiente comando desde la línea de comando:

identify -format '%Q' yourimage.jpg

Y debe obtener el valor de 0 (filos pequeños de baja calidad) a 100 (alta calidad, archivos grandes).

Fuente de información

Para los futuros visitantes, verificando la calidad de un JPEG dado, solo podría usar ImageMagick Tooling:

$> identify -format '%Q' filename.jpg
   92%

El algoritmo de compresión JPEG tiene algunos parámetros que influyen en la calidad de la imagen de resultados.

Uno de esos parámetros son las tablas de cuantización que define cuántos bits se utilizarán en cada coeficiente. Diferentes programas utilizan diferentes tablas de quatización.

Algunos programas permiten al usuario establecer el nivel de calidad 0-100. Pero no hay una defenición común de este número. La imagen realizada con Photoshop con 60% de calidad toma 46 kb, mientras que la imagen hecha con GIMP toma solo 26 kb.

Las tablas de cuantización también son diferentes.

Existen otros parámetros como submuestreo, método DCT, etc.

Por lo tanto, no puede describirlos a todos por un número de nivel de calidad único y no puede comparar la calidad de las imágenes JPEG por número único. Pero puede crear un número como Photoshop o GIMP que describirá Compromiss entre el tamaño en la calidad.

Más información:http://patrakov.blogspot.com/2008/12/jpeg-quality-is-meaningless-number.html

La práctica común es que cambia el tamaño de la imagen al tamaño apropiado y aplica JPEG después de eso. En este caso, las imágenes enormes y medias tendrán el mismo tamaño y calidad.

Como ya hay dos respuestas usando identify, aquí hay uno que también genera el nombre del archivo (para escanear varios archivos a la vez):

Si desea tener una salida simple de filename: quality Para usar en varias imágenes, puede usar

identify -format '%f: %Q' *

a Mostrar el nombre de archivo + compresión de todos los archivos dentro del directorio actual.

Entonces, básicamente hay dos casos que te importa:

  1. Si una imagen entrante tiene un conjunto de calidad demasiado alto, puede ocupar una cantidad inapropiada de espacio. Por lo tanto, es posible que desee, por ejemplo, reducir el entrante Q = 99 a Q = 85.

  2. Si una imagen entrante tiene un conjunto de calidad demasiado bajo, podría ser un desperdicio de espacio para elevar su calidad. Excepto que una imagen que ha tenido una gran cantidad de datos descartados no ocupará mágicamente más espacio cuando se recaude la calidad: las imágenes en bloque se comprimirán muy bien incluso en entornos de alta calidad. Entonces, en mi opinión, está perfectamente bien elevar Q = 1 a Q = 85.

De esto, creo que simplemente forzar una configuración de calidad decente es algo perfectamente aceptable.

Aquí hay una fórmula que he encontrado que funciona bien:

  1. JPG100Size (el tamaño que no debe exceder en bytes para una calidad 98-100%) = ancho*altura/1.7

  2. jpgxsize = jpg100size*x (x = porcentaje, por ejemplo, 0.65)

Por lo tanto, podría usarlos para descubrir estadísticamente en qué calidad se guardó su JPG por última vez. Si desea obtenerlo, digamos que 65% de calidad y si desea evitar el remuestreo, debe comparar el tamaño inicialmente para asegurarse de que aún no sea demasiado bajo, y solo entonces reduzca la calidad.

Cada nuevo guardado del archivo disminuirá aún más la calidad general, al usar valores de mayor calidad, preservará más imagen. Independientemente de lo que fuera la calidad de la imagen original.

Si reave un JPEG usando el mismo software que lo creó originalmente, utilizando la misma configuración, encontrará que el daño se minimiza: el algoritmo tenderá a arrojar la misma información que arrojó la primera vez. No creo que haya ninguna forma de saber qué nivel se seleccionó con solo mirar el archivo; Incluso si pudiera, el software diferente casi garantiza diferentes parámetros y redondeos, lo que hace que un partido sea casi imposible.

Esta puede ser una pregunta tonta, pero ¿por qué estaría preocupado por la microgestión de la calidad del documento? Creo que si usas ImageMagick para hacer la conversión, administrará la calidad del JPEG para ti para obtener el mejor efecto. http://www.php.net/manual/en/intro.imagick.php

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top