JPEG XL en la línea de comandos: cjxl y djxl
Las herramientas oficiales, usadas de verdad con libjxl 0.12.0: cómo instalarlas en cada sistema, los comandos que merece la pena saberse, lo que cuestan en bytes y en segundos la calidad y el esfuerzo, dos scripts por lotes probados con nombres de archivo complicados y los errores que te vas a encontrar, con su arreglo.
por Robert Castillo · Publicado el
La respuesta corta
Las herramientas oficiales de JPEG XL para la línea de comandos salen de libjxl, la implementación de referencia del formato. Con tres programas se hace casi todo: cjxl codifica, djxl descodifica y jxlinfo te dice qué hay dentro de un archivo. La versión actual es la 0.12.0, publicada el 1 de julio de 2026, y todos los comandos, salidas y cifras de esta página salen de ejecutarla nosotros.
Si te quedas con un solo comando, que sea este: cjxl foto.jpg foto.jxl. Cuando le das un JPEG, cjxl no vuelve a comprimir la imagen: reempaqueta los datos que el JPEG ya tiene de forma más eficiente. Con nuestra foto de prueba ahorró un 26,9%, y djxl reconstruyó el JPEG original con la misma suma de comprobación, metadatos incluidos.
Lo demás son detalles, pero algunos pillan por sorpresa. Un PNG se comprime con pérdida si no dices lo contrario, una opción de calidad sobre un JPEG da error en vez de aplicarse, y la versión que instala Ubuntu 24.04 tiene cuatro años. Todo eso está más abajo, con su solución.
Cómo lo hemos probado
La foto
Un paisaje de 3506×2329 hecho con una Nikon D90 por David Marcu y publicado como CC0 en Wikimedia Commons: 3,66 MB con EXIF, XMP, IPTC y perfil de color ProPhoto. Un archivo real de cámara, no una muestra de laboratorio.
La máquina
Un servidor Linux con 6 núcleos virtuales AMD EPYC, compartido con otros trabajos. Toma los tiempos como órdenes de magnitud: en tu ordenador serán otros, la proporción entre ajustes cambia mucho menos.
Las versiones
libjxl 0.12.0 (la compilación estática oficial) y, para ver qué cambia, la 0.7.0 que sigue trayendo Ubuntu 24.04. Lo de Windows, en Windows 11 con PowerShell 5.1 y el zip oficial.
Instalar cjxl, djxl y jxlinfo
Todos los sistemas importantes tienen paquete, pero la versión que te llevas cambia muchísimo de uno a otro. Estas son las que ofrecía cada fuente el 15 de octubre de 2026:
| Sistema | Comando | Versión |
|---|---|---|
| Windows (winget) | winget install libjxl.libjxl | 0.12.0 |
| Windows (Scoop) | scoop install libjxl | 0.12.0 |
| Windows (a mano) | jxl-x64-windows-static.zip de GitHub | 0.12.0 |
| Windows (Chocolatey) | No hay paquete | — |
| macOS (Homebrew) | brew install jpeg-xl | 0.12.0 |
| Arch Linux | sudo pacman -S libjxl | 0.12.0 |
| Fedora 43 y 44 | sudo dnf install libjxl-utils | 0.11.2 |
| Debian 13 | sudo apt install libjxl-tools | 0.11.2 |
| Ubuntu 25.10 y 26.04 LTS | sudo apt install libjxl-tools | 0.11.1 |
| Ubuntu 24.04 LTS, Debian 12 | sudo apt install libjxl-tools | 0.7.0 (2022) |
Windows. winget instala el zip oficial como aplicación portátil y añade su carpeta al PATH de tu usuario, así que cierra la terminal y abre otra antes de escribir cjxl --version. Si prefieres hacerlo a mano, descarga jxl-x64-windows-static.zip de la página de la versión 0.12.0 y descomprímelo: los programas están en x64-windows-static\bin. Añade esa carpeta al PATH o llama a cjxl.exe con su ruta completa. El zip que baja winget es exactamente ese, con la misma suma de comprobación.
macOS. En Homebrew el paquete se llama jpeg-xl, no libjxl. Instala cjxl, djxl, jxlinfo y jxltran, más las herramientas de desarrollo de libjxl (entre ellas ssimulacra2 y butteraugli_main), compilado todo a partir del código de la 0.12.0.
Comprueba qué tienes. cjxl --version responde con una línea como cjxl v0.12.0 4128790 [_AVX2_,SSE4,SSE2]; lo de los corchetes son las instrucciones del procesador que está aprovechando. No lo intentes con jxlinfo, que no tiene opción de versión (lo explicamos debajo de la tabla de errores).
Ubuntu 24.04 y Debian 12: cómo pasar de la 0.7
Ubuntu 24.04 LTS y Debian 12 siguen instalando libjxl 0.7.0, de 2022. Funciona —en nuestras pruebas incluso descodificó sin un fallo archivos hechos con la 0.12.0—, pero no tiene el esfuerzo 10 ni la opción de seguridad --reconstruct_jpeg de djxl, y le faltan cuatro años de correcciones, entre ellas la larga lista de refuerzos de seguridad que trae la 0.12.0. Además trata las opciones de calidad sobre un JPEG de otra manera, y eso puede cambiar en silencio lo que hace un script (lo explicamos más abajo).
La forma más limpia de tener la 0.12.0 es la compilación estática oficial: un solo archivo comprimido, programas autónomos y ni una biblioteca del sistema tocada. Es exactamente como está montado nuestro servidor de pruebas. Ve lanzando estos comandos uno a uno:
| Bash · Ubuntu / Debian |
|---|
sudo apt install lzip |
El archivo no trae carpeta propia —todo va suelto en la raíz—, por eso se descomprime en un directorio aparte. En el PATH por defecto de Ubuntu, /usr/local/bin va antes que /usr/bin, así que estos enlaces mandan aunque también tengas libjxl-tools instalado; abre otra terminal (o ejecuta hash -r) y la versión debería decir v0.12.0. La publicación trae también paquetes .deb para Ubuntu 24.04, llamados jxl y libjxl. Esos dejan cjxl en /usr/bin, el mismo sitio que libjxl-tools, así que si vas por ahí desinstala antes el paquete de la distribución.
Reempaquetar un JPEG sin perder ni un bit
Esta es la conversión que busca casi todo el mundo, y en la que JPEG XL no tiene rival: archivos más pequeños sin renunciar a nada, y reversible cuando quieras.
Convertir
cjxl foto.jpg foto.jxl escribe Encoding [JPEG, lossless transcode, effort: 7] y Compressed to 2671.6 kB including container. Nuestra foto de 3.655.400 bytes se quedó en 2.671.641, un 26,9% menos, en menos de un segundo.
Recuperar el JPEG
djxl foto.jxl vuelta.jpg contesta Reconstructed to JPEG. Tardó entre 0,3 y 0,4 segundos en nuestro servidor. Ese es el mensaje que hay que buscar: significa que se ha reconstruido el archivo original, no que se haya codificado uno nuevo.
Demostrarlo
Compara las sumas de comprobación: sha256sum en Linux, shasum -a 256 en Mac, Get-FileHash en PowerShell. Los dos archivos dieron 7cf96c2b…534b, tanto en Linux como en Windows.
Ese último paso es el que importa. No es «visualmente idéntico»: es el mismo archivo, byte a byte, con el EXIF y el perfil de color dentro. En Linux o Mac puedes comprobarlo sin crear ningún archivo temporal: djxl foto.jxl - --output_format jpg | cmp - foto.jpg no dice nada si coinciden.
Con cada JPEG, cjxl añade un aviso, Implicit-default for JPEG is lossless-transcoding, que solo te cuenta lo que ha decidido. Si pones --lossless_jpeg=1 la decisión queda explícita y el aviso desaparece. En el lado de la descodificación, la 0.12.0 estrena --reconstruct_jpeg (-J): en vez de sacarte un JPEG nuevo cuando no puede reconstruir el original, djxl se para con Error: could not decode losslessly to JPEG.
La compatibilidad también funciona hacia atrás. El djxl 0.7.0 de Ubuntu reconstruyó nuestro archivo hecho con la 0.12.0 y devolvió el JPEG idéntico. El formato se publicó como norma en 2022 (ISO/IEC 18181); lo que sigue avanzando son las herramientas.
-d y -q: cómo pedir la calidad
Con todo lo que no sea JPEG, cjxl comprime los píxeles y tú decides cuánta pérdida aceptas. Hay dos maneras de decirlo. -d (distancia) es la propia del formato: 0 es sin pérdida matemática, 1 es lo que el codificador considera visualmente sin pérdida, y los números más altos permiten más distorsión, hasta 25. -q (calidad) es una escala de 0 a 100 pensada para que se parezca a la del JPEG, y cjxl la traduce sin más a una distancia. Usa una u otra: las dos a la vez dan error.
Codificamos nuestra foto (guardada como PNG de 9,85 MB) con las calidades más habituales y puntuamos cada resultado con SSIMULACRA2, que es la nota de la tabla: 90 es visualmente sin pérdida, 70 calidad alta y 50 calidad media. De calidad 30 para arriba la conversión es una recta, distancia = 0,1 + (100 − q) × 0,09:
| Ajuste | Tamaño | Nota |
|---|---|---|
| -q 100, sin pérdida | 6,49 MB | Píxeles idénticos |
| -q 95 = -d 0.55 | 1,41 MB | 89,9 |
| -q 90 = -d 1 (por defecto con PNG) | 0,80 MB | 86,7 |
| -q 85 = -d 1.45 | 0,58 MB | 83,4 |
| -q 80 = -d 1.9 | 0,47 MB | 80,2 |
| -q 70 = -d 2.8 | 0,34 MB | 73,6 |
| -q 50 = -d 4.6 | 0,21 MB | 60,8 |
Por debajo de 30 la curva se dobla: calidad 20 da distancia 9,07, calidad 10 da 15,27 y calidad 0, el máximo, 25. Para fotos no le hacen falta a nadie.
Para el día a día, -d 1 (o -q 90) es un buen punto de partida, y una distancia de entre 0,5 y 0,7 es lo indicado para un original de alta calidad que vas a retocar después. Escríbelo con punto, -d 0.5, que es como lo entiende el programa. La propia ayuda de cjxl --help recomienda moverse entre 0,5 y 3.
La trampa: opciones de calidad sobre un JPEG
Prueba cjxl foto.jpg foto.jxl -d 1 con la versión 0.12.0 y no se escribe nada: sale un error que empieza por Must not set non-zero distance (con -q, por Must not set quality below 100), y lo tienes completo en la tabla de errores. cjxl está protegiendo el reempaquetado sin pérdida: una distancia no pinta nada cuando no va a tocar los píxeles.
Si de verdad quieres un archivo con pérdida y más pequeño a partir de un JPEG, hay que decirlo: cjxl foto.jpg foto.jxl --lossless_jpeg=0 -d 1. Nuestra foto salió con 800.133 bytes, menos de un tercio que el reempaquetado. El precio es una segunda ronda de pérdida sobre una imagen que ya se comprimió una vez y, como verás en el apartado de metadatos, parte de los metadatos. Para un archivo que vas a guardar, el 27% sin pérdida sale más a cuenta.
La versión 0.7.0 se porta de otra manera, y aquí es donde muerde: con ella, -d 1 sobre un JPEG se ignora en silencio. Nuestro comando de prueba terminó sin error y escribió un reempaquetado sin pérdida. O sea, un script que «funcionaba» en Ubuntu 24.04 falla con la 0.12.0, y uno que contaba con -d para encoger los JPEG nunca los encogió. Si escribes --lossless_jpeg=0 o =1 de forma explícita, las dos versiones hacen lo mismo.
El esfuerzo (-e): qué compran los segundos de más
-e decide cuánto trabaja el codificador, de 1 a 10, y por defecto vale 7. Aquí van dos trabajos con la misma foto: reempaquetar el JPEG de 3,66 MB y codificar su versión en PNG, de 9,85 MB, a -d 1. Cada casilla da el tamaño del archivo y el tiempo de reloj, mediana de tres pasadas (el sin pérdida tiene su propia tabla en el apartado siguiente):
| Nivel | JPEG sin pérdida | PNG con pérdida |
|---|---|---|
| 1 | 2,867 MB · 0,6 s | 0,784 MB · 0,7 s |
| 2 | 2,867 MB · 0,6 s | 0,784 MB · 0,6 s |
| 3 | 2,672 MB · 0,6 s | 0,725 MB · 0,6 s |
| 4 | 2,672 MB · 0,7 s | 0,767 MB · 0,6 s |
| 5 | 2,672 MB · 0,7 s | 0,782 MB · 1,0 s |
| 6 | 2,672 MB · 0,7 s | 0,797 MB · 2,5 s |
| 7 (por defecto) | 2,672 MB · 0,9 s | 0,800 MB · 2,1 s |
| 8 | 2,666 MB · 1,8 s | 0,754 MB · 23,6 s |
| 9 | 2,665 MB · 11,6 s | 0,753 MB · 36,7 s |
| 10 | 2,668 MB · 12,3 s | 0,752 MB · 34,7 s |
Léela en horizontal, no de arriba abajo. Al reempaquetar un JPEG, los esfuerzos del 3 al 7 dan exactamente el mismo archivo, y del 8 en adelante se ahorra un 0,2% a cambio de esperar entre dos y catorce veces más; el 10 incluso salió un poco más grande que el 9. Con pérdida, el esfuerzo 3 da el archivo más pequeño pero con peor nota (SSIMULACRA2 85,5 frente a 86,7 con el valor por defecto), mientras que del 8 al 10 los archivos salen alrededor de un 6% más pequeños que con el 7 y prácticamente con la misma nota (86,4–86,5), a cambio de once a diecisiete veces más tiempo.
Conclusión: déjalo en 7 para casi todo. El esfuerzo 10 no existe en la 0.7.0, y la 0.12.0 tiene además un 11 reservado a expertos: sin --allow_expert_options responde Valid range is {1, 2, ..., 10}.
Sin pérdida desde PNG quiere decir -d 0
Con PNG, APNG, PPM y el resto de formatos de píxeles, lo que hace cjxl por defecto es -d 1: visualmente sin pérdida, pero con pérdida. Para fotos que solo vas a mirar está bien; para capturas de pantalla, escaneos, ilustraciones o cualquier cosa que estés archivando, donde quieres conservar cada píxel, no. Pon -d 0 (o -q 100).
Nuestra foto guardada como PNG pesaba 9.854.523 bytes. A -d 0 salió así con cada esfuerzo (mediana de tres pasadas hasta el 7, una sola del 8 al 10):
| Nivel | Tamaño | Tiempo |
|---|---|---|
| 1 | 8,373 MB | 0,4 s |
| 2 | 7,110 MB | 0,6 s |
| 3 | 6,826 MB | 0,9 s |
| 4 | 6,782 MB | 1,4 s |
| 5 | 6,852 MB | 2,0 s |
| 6 | 6,795 MB | 2,5 s |
| 7 (por defecto) | 6,489 MB | 3,8 s |
| 8 | 6,218 MB | 16,7 s |
| 9 | 6,190 MB | 24,8 s |
| 10 | 6,101 MB | Unos 5,5 min |
Con el esfuerzo por defecto queda un 34% por debajo del PNG, y al descodificarla de nuevo compare -metric AE de ImageMagick contó 0 píxeles distintos. Donde el esfuerzo rinde de forma más constante es aquí: el 9 deja el archivo un 4,6% más pequeño que el 7 a cambio de esperar seis veces y media más, y el 10 rasca otro 1,4% a cambio de cinco minutos y medio con una sola foto (324 y 337 segundos en dos pasadas distintas). Usa el 9 para un archivo que vas a crear una vez y guardar durante años.
El GIF es la excepción en sentido contrario: cjxl lo codifica sin pérdida por defecto, como verás en el apartado de animaciones.
jxlinfo: mira qué hay dentro
Antes de convertir un .jxl de vuelta, conviene saber de qué tipo es. Estas son las líneas clave que da jxlinfo con nuestro JPEG reempaquetado:
| Lo que escribe jxlinfo |
|---|
JPEG XL image, 3506x2329, (possibly) lossless, 8-bit RGB |
La línea que más importa es JPEG bitstream reconstruction data available: mientras esté ahí, djxl puede devolverte el JPEG original. Un archivo con pérdida dice lossy en vez de (possibly) lossless y no lleva la línea de reconstrucción; una animación empieza por JPEG XL animation y enumera cada fotograma con su duración. Con -v ves también las cajas del contenedor. En la 0.12.0 jxlinfo se reescribió entero y solo admite -v y -h.
Metadatos: qué se conserva y qué no
Nuestra foto de prueba lleva EXIF (con cámara y fecha), XMP, IPTC y un perfil ICC ProPhoto. Para comprobar el GPS y las palabras clave se los añadimos con exiftool a un segundo JPEG pequeño. Esto es lo que salió por cada camino:
| Camino | Se conserva | Se pierde |
|---|---|---|
| JPEG → JXL reempaquetado → JPEG | Todo: EXIF y GPS, XMP, IPTC, perfil ICC | Nada |
| JPEG → JXL reempaquetado → PNG | EXIF y GPS, XMP, perfil ICC | IPTC |
JPEG → JXL con pérdida (--lossless_jpeg=0) | EXIF y GPS; el perfil ICC pasa a ser una descripción de color propia del formato | XMP, IPTC |
| PNG con EXIF y XMP → JXL a -d 1 | EXIF, XMP; el perfil ICC se convierte igual que arriba | No hay más que perder |
El reempaquetado sin pérdida es el camino seguro: vuelve el JPEG entero, y con él hasta el último byte de metadatos. exiftool lee el EXIF y el XMP directamente del .jxl; el bloque IPTC y el perfil ICC original viajan dentro de los datos de reconstrucción y reaparecen al reconstruir el JPEG.
La sorpresa está en recodificar un JPEG con pérdida: cjxl 0.12.0 conservó el EXIF, posición GPS incluida, pero se dejó por el camino el XMP y el IPTC. Si tus palabras clave, valoraciones o ajustes de Lightroom van en el XMP, vuelve a meterlo a mano: exiftool -xmp -b foto.jpg > foto.xmp y luego añade -x xmp=foto.xmp al comando de cjxl. Comprobamos que así el campo de autor llega al .jxl.
Para quitar el GPS y el resto del EXIF antes de compartir una foto está -x strip=exif. Sobre un JPEG se niega con Cannot strip exif metadata, try setting --allow_jpeg_reconstruction=0., porque el original ya no se podría reconstruir byte a byte. Añade esa opción y funciona: la imagen se sigue reempaquetando sin pérdida, pero djxl pasa a decir Decoded to pixels. y escribe un JPEG nuevo en lugar del original. Y para sacar los metadatos de un .jxl basta con poner la extensión del tipo en la salida: djxl foto.jxl foto.exif o djxl foto.jxl foto.xmp.
GIF y APNG animados
cjxl lee GIF y APNG animados y conserva cada fotograma con su tiempo. Hicimos con ffmpeg tres animaciones de 60 fotogramas a 480×270 y convertimos cada una con los ajustes por defecto y con la opción contraria:
| Animación | cjxl por defecto | Al revés |
|---|---|---|
| GIF, carta de ajuste plana: 646 KB | 606 KB, sin pérdida (−6%) | -d 1: 1.177 KB (+82%) |
| GIF, barrido sobre la foto: 6.074 KB | 5.158 KB, sin pérdida (−15%) | -d 1: 1.663 KB (−73%) |
| APNG, carta de ajuste plana: 1.009 KB | 990 KB, con pérdida (−2%) | -d 0: 620 KB (−38%) |
Dos valores por defecto explican la tabla. El GIF se codifica sin pérdida, y que la pérdida ayude o no depende por completo del contenido: con gráficos planos el archivo creció un 82%, con fotogramas fotográficos bajó un 73%. El APNG, como el PNG, va por defecto a -d 1 con pérdida, y con nuestra animación de gráficos fue la peor opción: un 60% más grande que sin pérdida. Prueba las dos cosas con un par de tus archivos antes de convertir una carpeta entera.
Para sacar las animaciones otra vez: djxl escribe todos los fotogramas en un PNG animado tanto si llamas a la salida .apng como .png (contamos 60 fotogramas en los dos casos). GIF no sabe escribirlo (el mensaje exacto está en la tabla de errores), así que si necesitas otra vez un GIF, convierte ese APNG con ffmpeg o ImageMagick.
Archivos progresivos (-p)
-p reordena el archivo para que una descarga a medias ya enseñe la imagen entera, con menos detalle. Cuesta un poco: nuestra foto con pérdida pasó de 799.774 a 852.155 bytes (+6,5%). Para ver qué se compra con eso, cortamos las dos versiones antes de su final, descodificamos lo que quedaba con djxl --allow_partial_files y lo puntuamos frente al original:
| Recibido | Normal | Progresivo |
|---|---|---|
| 20% | Sin imagen | Sin imagen |
| 40% | −8,1 | 16,6 |
| 60% | 1,4 | 65,6 |
| 75% | 13,5 | 71,7 |
| 90% | 34,0 | 78,0 |
| 100% | 86,7 | 87,4 |
Sin -p la imagen también ocupa todo el encuadre pronto, pero casi toda se queda en un borrón provisional hasta que llegan casi todos los datos. Con -p, el 60% del archivo ya puntúa 65,6. Merece la pena para imágenes que se sirven en una web, y no aporta nada en un archivo de copias. También funciona al reempaquetar JPEG: nuestra foto creció un 1,9% y siguió volviendo idéntica byte a byte.
Convertir una carpeta entera en Linux o Mac
Este script pasa a .jxl, sin pérdida, los .jpg, .jpeg y .png de una carpeta (no los de sus subcarpetas) y deja los originales donde estaban. Guárdalo como convertir-a-jxl.sh y ejecútalo con bash convertir-a-jxl.sh ~/Imágenes/vacaciones:
| Bash · Linux y macOS |
|---|
#!/usr/bin/env bash |
Qué hace: los JPEG se reempaquetan sin pérdida y los PNG se codifican con -d 0, así que no se pierde nada en ningún caso. Se salta cualquier imagen que ya tenga su .jxl, de modo que puedes pararlo y volver a lanzarlo. Cada archivo se escribe primero como .part y solo se renombra cuando cjxl ha terminado, así que una ejecución interrumpida nunca deja un .jxl a medias que la siguiente daría por bueno. El archivo nuevo hereda la fecha del original, y si uno falla lo avisa y sigue con los demás. Las extensiones en mayúsculas, como .JPG, también entran.
Lo lanzamos dos veces sobre una carpeta con nombres puestos para dar guerra —espacios, una ñ, corchetes, letras cirílicas, un .JPG en mayúsculas—, más un .jxl que ya existía y una «foto» que en realidad era un archivo de texto. La segunda vez se saltó todo lo hecho y volvió a avisar del falso. En un Mac, ejecútalo con bash como se indica en lugar de pegarlo en la terminal, que por defecto usa zsh: shopt es una orden de bash. Para comprobar después todos los JPEG, abre una terminal dentro de la carpeta y pega esta línea; al ir envuelta en bash -c funciona igual desde bash que desde zsh: bash -c 'shopt -s nullglob nocaseglob; for f in *.jpg *.jpeg; do djxl "${f%.*}.jxl" - --output_format jpg --quiet | cmp -s - "$f" && echo "idéntico: $f" || echo "DISTINTO: $f"; done'
Convertir una carpeta entera en Windows (PowerShell)
Lo mismo para Windows. Cambia la ruta de la primera línea y pega el bloque entero en una ventana de PowerShell. Al pegarlo, en vez de guardarlo como archivo .ps1, te evitas la directiva de Windows que por defecto bloquea la ejecución de scripts:
| PowerShell · Windows |
|---|
$carpeta = "C:\Fotos" |
Se comporta exactamente igual que la versión de bash, y lo probamos de la misma manera: dos veces sobre la carpeta de nombres raros, en Windows PowerShell 5.1 con Windows 11 y en PowerShell 7.6 en Linux. -LiteralPath es lo que impide que un nombre con corchetes se lea como comodín, y la comparación -in no distingue mayúsculas, así que los .JPG también entran. Los mensajes van sin tildes a propósito: si algún día lo guardas como .ps1 con el Bloc de notas, PowerShell 5.1 no te los desfigura. Para comprobar un resultado a mano: djxl foto.jxl prueba.jpg y después (Get-FileHash foto.jpg).Hash -eq (Get-FileHash prueba.jpg).Hash tiene que decir True.
Hay un límite común a los dos scripts: si foto.jpg y foto.png están juntas, las dos quieren llamarse foto.jxl, así que la segunda se salta. Cambia antes el nombre a una de ellas.
Los errores que te vas a encontrar, y su arreglo
Todos los mensajes están copiados de nuestras pruebas, tal cual los escribe el programa. cjxl saca primero una línea con su versión; el error es la siguiente.
| Mensaje | Causa y arreglo |
|---|---|
Must not set non-zero distance in combination with --lossless_jpeg=1, which is set by default. | Has usado -d o -q sobre un JPEG (0.12.0). Arreglo: añade --lossless_jpeg=0 si quieres pérdida, o quita -d para reempaquetar sin pérdida. |
Getting pixel data failed. | La entrada no es un formato que lea cjxl (nos pasó con WebP, TIFF y BMP) o el archivo está dañado. Arreglo: pásalo antes a PNG, por ejemplo con magick entrada.webp entrada.png. cjxl lee JPEG, PNG, APNG, GIF, PPM/PNM/PFM/PAM, PGX y JXL. |
Reading image data failed. | No existe ningún archivo en esa ruta. Arreglo: revisa el nombre y pon comillas si la ruta lleva espacios. |
JPEG bitstream reconstruction data could not be created. Possibly there is too much tail data. | En nuestras pruebas, un JPEG en CMYK (habitual en imprenta); 300 KB de datos pegados al final no dieron problema. Arreglo: pasa la imagen antes a RGB. La 0.12.0 rechazó el CMYK por todos los caminos que probamos. |
Invalid flag value for --effort: Valid range is {1, 2, ..., 9}. | Tienes libjxl 0.7 (Ubuntu 24.04, Debian 12) y has pedido -e 10. Arreglo: actualiza, o usa -e 9. |
Unknown argument: --reconstruct_jpeg | djxl 0.7, anterior a esa opción. Arreglo: actualiza, o quita la opción. |
can't decode to the file extension '.gif'. | djxl no escribe GIF. Arreglo: descodifica a .apng y conviértelo con ffmpeg o ImageMagick. |
Cannot strip exif metadata, try setting --allow_jpeg_reconstruction=0. | -x strip=exif al reempaquetar un JPEG. Arreglo: añade esa opción; el JPEG original ya no se podrá recuperar byte a byte. |
El término 'cjxl' no se reconoce como nombre de un cmdlet… | PowerShell no encuentra cjxl en el PATH. Arreglo: abre una terminal nueva después de instalar con winget, o llama a cjxl.exe con su ruta completa. |
…porque la ejecución de scripts está deshabilitada en este sistema | Has guardado el bucle de PowerShell como archivo .ps1. Arreglo: pégalo en la ventana, o ejecuta una vez Set-ExecutionPolicy -Scope CurrentUser RemoteSigned. |
tar (child): lzip: Cannot exec | Falta lzip, así que no se puede descomprimir la versión estática. Arreglo: sudo apt install lzip. |
Hay tres más que se resuelven solos al leerlos: si pones a la vez -d y -q, cjxl se niega a elegir por ti; si olvidas el nombre del archivo de salida, te recuerda que no le has dicho dónde escribir; y jxlinfo no tiene opción de versión, así que jxlinfo --version toma «--version» por el nombre de una imagen y dice que no puede leerla. La versión te la da cjxl --version.