¿Podemos cambiar el tamaño de una imagen JPEG sin decodificarla y volver a codificarla?

12

Quiero convertir una imagen JPEG de 640x480 a 320x240. Sé que se puede hacer decodificando la imagen JPEG en YCbCr sin formato, escalarla y volver a codificarla en JPEG. Pero, ¿es posible con la codificación JPEG escalar directamente la imagen sin decodificación?

Necktwi
fuente

Respuestas:

14

Puede hacerlo, pero solo si su visor JPEG admite la extensión SmartScale JPEG. jpegtran puede hacer esto para tamaños de N / 8, con N = 1..16. Básicamente, el tamaño del bloque DCT se cambia de 8x8 a otro durante la recompresión (por ejemplo, 4x4), que escala la imagen de manera efectiva.

Nota: SmartScale se introdujo en la versión 8 de la biblioteca libjpeg, pero los espectadores no lo admiten ampliamente.

Un documento que describe los cambios en detalle se puede encontrar aquí: Evolución de JPEG .

EDITAR: Parece que la mayoría de los espectadores no pueden mostrar estas imágenes, ya que están basadas en libjpeg-turbo. Y libjpeg-turbo decidió no implementar esta función . De hecho, he probado bastantes programas (en Ubuntu 14.04 y Windows 8) y ninguno ha podido mostrar la imagen reducida creada con jpegtrans. Incluso Photoshop, IrfanView y GIMP fallaron.

EDIT 2: De hecho, Ubuntu y Fedora ni siquiera envían la biblioteca libjpeg8, sino que la reemplazan completamente con la versión libjpeg-turbo. Por lo tanto, ninguno de los programas podrá leer archivos JPEG SmartScale, salvo algunos binarios que están vinculados estáticamente a la biblioteca libjpeg8 original.

jmiserez
fuente
¿Existe un códec que construya la imagen que crece simplemente agregando más datos a la imagen?
Necktwi
¿Qué pasa con el JPEG progresivo? ¿No hace exactamente lo que estoy pidiendo?
Necktwi
No, eso hace algo ligeramente diferente al aumentar la calidad de la imagen (de baja a completa), pero la resolución no cambia ( referencia ). Sin embargo, hay otra extensión JPEG llamada "modo jerárquico", que codifica diferentes resoluciones ( ver también aquí ). Pero nuevamente, libjpeg-turbo no lo admite (ver aquí , busca "progresivo" en el texto).
jmiserez
1
Y para responder el primer comentario, por supuesto, hay tales códecs. Simplemente no JPG. Lo que está buscando se llama pirámide de imagen o representación multiescala. Por ejemplo, JPEG2000 usa una transformación wavelet que crea una pirámide wavelet. Hay otras pirámides, como las pirámides gaussianas o laplacianas. Este conjunto de diapositivas ofrece una buena descripción general de cómo funcionan las cosas, mientras que JPEG2000 se trata aquí y aquí .
jmiserez
Gracias por la información sobre los nuevos formatos JPEG. Todavía no espero que muchas imágenes fuente (cámaras, escáneres, etc.) las usen.
AFH
3

La respuesta corta es no. Una imagen JPEG utiliza compresión, lo que significa que cada byte de salida depende de todos los demás. Si cambia el número de bytes de imagen, debe descomprimir y volver a comprimir.

Habrá una pérdida de calidad como resultado de la recompresión, ya que JPEG usa compresión con pérdida, pero de todos modos está perdiendo calidad al descuartizar la resolución. Puede obtener la mejor calidad posible de la imagen de baja resolución aumentando el nivel de calidad JPEG al volver a comprimir, aunque esto, por supuesto, aumentará el tamaño del archivo.

Si hace mucho trabajo con imágenes, lo mejor es trabajar en un formato de compresión sin pérdidas, como PNG, convirtiendo a JPEG solo cuando las imágenes estén finalizadas, siempre que tenga espacio de disco adicional.

AFH
fuente