libjpeg es una biblioteca libre con funciones para manejar el formato de datos de imagen JPEG . Implementa un códec JPEG (codificación y decodificación) junto con varias utilidades para manejar datos JPEG. Está escrito en C y se distribuye como software libre junto con su código fuente bajo los términos de una licencia de software libre personalizada permisiva ( similar a BSD ), que exige atribución . La variante original es mantenida y publicada por el Independent JPEG Group (IJG). Mientras tanto, hay varias bifurcaciones con características adicionales.
Las imágenes JPEG JFIF se utilizan ampliamente en la Web. La cantidad de compresión se puede ajustar para lograr el equilibrio deseado entre el tamaño del archivo y la calidad visual. [4]
Los siguientes programas de utilidad se envían junto con libjpeg:
El programa de línea de comandos jpegtran ofrece varias funciones para reformatear y recodificar la representación de los coeficientes de DCT , para la transformación de datos de imagen reales y para descartar datos auxiliares en archivos JPEG, respectivamente. Las transformaciones relacionadas con la representación de los coeficientes comprenden:
Todas estas transformaciones son completamente reversibles y sin pérdidas. Las transformaciones de los datos de imagen comprenden:
Estos son reversibles y sin pérdidas solo en lo que respecta a los datos de imagen que se conservan. No se produce una recodificación con cuantificación repetida con pérdida de los datos de imagen ( pérdida de generación ).
La implementación JPEG del Independent JPEG Group (IJG) se publicó por primera vez el 7 de octubre de 1991 y se ha desarrollado considerablemente desde entonces. El desarrollo fue realizado inicialmente principalmente por Tom Lane . La implementación de código abierto del IJG fue uno de los principales paquetes de código abierto y fue clave para el éxito del estándar JPEG. Muchas empresas lo incorporaron en una variedad de productos, como editores de imágenes y navegadores web. [9]
Para la versión 5, que se lanzó el 24 de septiembre de 1994, se reescribió todo el código base. Se introdujeron los programas de utilidad rdjpgcom y wrjpgcom para manejar comentarios de texto incrustados. La versión 6 del 2 de agosto de 1995 incluía soporte para JPEG progresivo y, por primera vez, el programa de utilidad jpegtran . Esta utilidad se amplió con funciones para rotar y voltear imágenes y reducción de escala de grises en la versión 6b.
A partir de la versión 6b de libjpeg del 27 de marzo de 1998, Miyasaka Masaru bifurcó una rama llamada libjpeg/SIMD , que incluía optimizaciones para SIMD x86. Recibió contribuciones sustanciales de los proyectos TigerVNC y VirtualGL en 2009. Sobre esa base, se creó el proyecto libjpeg-turbo en 2010. [10]
El 4 de marzo de 2014 se publicó la primera versión de la bifurcación de optimización de tamaño de archivo MozJPEG . Para esta versión, Josh Aas de Mozilla Research reelaboró el script de Perl jpegcrush del desarrollador principal de x264, Loren Merritt, y lo integró en la base de código de libjpeg-turbo. [11]
El 10 de julio de 2014, Mozilla lanzó la versión 2.0, que agregó principalmente cuantificación de enrejado y ahora también puede reducir el tamaño de los archivos JPEG de línea base. Facebook , Inc. donó60.000 dólares para el desarrollo de la próxima versión, [12] y CloudFlare asignó un desarrollador para la mejora de MozJPEG. [ 13]
En 2019, libjpeg-turbo se convirtió en la implementación de referencia aprobada por ISO e ITU para el formato JPEG. [14]
En abril de 2024, Google presentó Jpegli , una nueva biblioteca de codificación JPEG que ofrece capacidades mejoradas y una mejora del índice de compresión del 35 % en configuraciones de compresión de alta calidad, mientras que la velocidad de codificación es comparable con MozJPEG. [15]
Después de 11 años y un cambio de liderazgo, el IJG bajo Guido Vollbeding lanzó nuevas versiones de libjpeg (7 a 9), de las cuales cada una rompió la compatibilidad ABI con versiones anteriores. [16] Los cambios que se tenían en perspectiva después de la serie 6x no se entregaron. [17]
En la versión 7, se introdujo el soporte para codificación aritmética , que anteriormente había sido rechazado debido a la situación de la patente , así como la función de recorte en jpegtran ( -crop
). [17]
Las versiones 8 y 9 sirvieron básicamente para la introducción de extensiones de formato incompatibles [18] que fueron controvertidas y se consideran ineficaces e inferiores a las soluciones estandarizadas existentes [19] [20] . Su estandarización fue rechazada después de su presentación a la UIT-T . El organizador original Tom Lane y otros critican estos cambios como una ruptura con los objetivos del IJG [18] .
Las bifurcaciones más conocidas son libjpeg-turbo, que optimiza la velocidad de ejecución, y MozJPEG, que optimiza para tamaños de archivo más pequeños.
También existe una biblioteca con un nombre similar de la ISO , que pretende ser una implementación completa de los estándares JPEG, JPEG XT y JPEG-LS . [26]
libjpeg-turbo es una bifurcación de libjpeg que utiliza instrucciones SIMD para acelerar la codificación y decodificación de JPEG de línea base. Muchos proyectos ahora utilizan libjpeg-turbo en lugar de libjpeg, incluidas las distribuciones de Linux populares ( Fedora , Debian , Mageia , openSUSE , ...), Mozilla y Chrome . [28] [29] [30] Además del rendimiento, algunos proyectos han optado por utilizar libjpeg-turbo porque les permite mantener la compatibilidad ABI con la versión anterior de libjpeg v6b. [31] libjpeg v7, v8 y v9 rompieron la compatibilidad ABI con versiones anteriores. [16]
libjpeg-turbo implementa la codificación aritmética compatible con el estándar y las características de recorte sin pérdida que se ven en libjpeg v7. También se puede configurar para que sea compatible con la ABI de libjpeg v7 o v8, pero implementa el escalado DCT y el SmartScale propietario, que se basa en el escalado DCT. [32] libjpeg-turbo elige no admitir SmartScale, porque no es un estándar ITU-T y porque su propia investigación lo encuentra (y al escalado DCT) ineficaz. [22] Por extensión, dado que la única característica nueva importante en libjpeg v9 es específica del formato SmartScale, el proyecto libjpeg-turbo ha optado por renunciar a emular libjpeg v9. [19]
Desde 2019, libjpeg-turbo es una de las dos implementaciones de referencia JPEG, disponibles como ISO/IEC 10918-7 e ITU-T T.873. [14] La otra implementación de referencia es ISO libjpeg, que también incluye soporte para JPEG XT y JPEG LS.
MozJPEG es una derivación de libjpeg-turbo realizada por Josh Aas y otros de Mozilla Research. Su objetivo es acelerar los tiempos de carga de las páginas web logrando una reducción del tamaño de archivo (de aproximadamente un 10 %) y, por lo tanto, del tiempo de transmisión mediante la mejora de la eficiencia de codificación, manteniendo al mismo tiempo la calidad de la imagen. Para lograrlo, utiliza más potencia de procesamiento para la codificación (asimetría), manteniendo al mismo tiempo la compatibilidad total con el estándar JPEG y sin requerir cambios en el lado del decodificador.
Las técnicas que utiliza MozJPEG para lograr una alta compresión incluyen la optimización de árboles de Huffman , el uso de codificación progresiva para dividir de manera óptima el espectro de coeficientes DCT en escaneos separados y el uso de cuantificación de enrejado . Además, los ajustes preestablecidos están ajustados agresivamente para minimizar el tamaño de los archivos.
Además de libjpeg-turbo, MozJPEG también se basa en jpegcrush, un script de Perl de Loren Merritt. [11] [34]
En abril de 2024, Google presentó Jpegli , una nueva biblioteca de codificación JPEG que ofrece capacidades mejoradas y una mejora del índice de compresión del 35 % en configuraciones de compresión de alta calidad, mientras que la velocidad de codificación es comparable con MozJPEG. [35]
El grupo de expertos en fotografía ISO/IEC mantiene una implementación de software de referencia para las extensiones JPEG base (ISO/IEC 10918-1 y 18477-1) y JPEG XT (ISO/IEC 18477 Partes 2 y 6-9), así como para JPEG-LS sin pérdida (ISO/IEC 14495). [36] También incluye algunas de las optimizaciones de MozJPEG. Aunque también se llama libjpeg, no está relacionado con el código fuente proporcionado por Independent JPEG Group (IJG) y no admite extensiones propietarias introducidas por IJG desde 2007.
La única preocupación era que es poco probable que Guido Vollbeding esté suscrito a esta lista y que IJG JPEG esté desarrollado esencialmente por una sola persona.