Dropbox lanzó recientemente Lepton ( GitHub ), un método que comprime sin pérdidas las imágenes JPEG de ida y vuelta, ahorrando un promedio del 22%.
Debido al principio del casillero , no se puede garantizar que ningún algoritmo de compresión general genere un archivo más pequeño ( general porque no se aplica a entradas restringidas a un formato específico). Lepton explota las características comunes de los archivos JPEG, que si se subvierten, podrían encasillarlo para producir un archivo más grande que la fuente.
Requisitos
Escribe un programa que genere:
- Una imagen JPEG / JFIF válida,
- con un tamaño entre 0.5 MB y 1 MB,
- no menor a 256 × 256 px,
- no más grande que 4096 × 4096 px,
- reconocible por Lepton (puede "comprimir" con éxito una
.lep
imagen), y - descomprime a un idéntico
.jpg
(como la entrada). APPx
,COM
y otros metadatos, las secciones de marcador no gráficas están restringidas en el JPEG (inyectar cantidades arbitrarias de bytes aleatorios en la imagen para aproximar asintóticamente la compresión 1: 1 es poco convincente).- se permite un
APP0
marcador JFIF pero no se permite ninguna miniatura (debe tener exactamente 16 bytes) - tl; dr Si no está insertando metadatos intencionalmente en un segmento EXIF y deshabilita cualquier tipo de miniatura que la biblioteca de idiomas de su elección desea poner en la imagen, debería estar bien.
- se permite un
Publique el código y la imagen.
Si quieres escribir un programa que produzca un imagen de Lepton que cuando se convierte produce un JPEG que cumple con los criterios, está bien. Debe permanecer idéntico a través de arbitrariamente muchos ciclos JPEG → Lepton → JPEG → ...
Puntuación
El tamaño de byte de la imagen de Lepton dividido por la imagen JPEG de origen. Mayor (peor compresión de Lepton) es mejor. Ejecute Lepton con banderas e interruptores predeterminados.
Obteniendo Lepton
Un curso intensivo de 5 segundos para construir Lepton:
git clone https://github.com/dropbox/lepton.git
cd lepton
./autogen.sh && ./configure && make
# fish shell: ./autogen.sh ;and ./configure ;and make
Entonces ./lepton --help
debería decirte cosas.
Respuestas:
Python 3 + mozjpeg + / dev / urandom, 720 × 720: promedio. puntaje 102%
Depende del
mozjpeg
paquete, el código asume que está instalado/usr/local/opt/mozjpeg
. (en OS X es trivial de instalar, solo ejecutebrew install mozjpeg
)También depende de
/dev/urandom
un archivo especial, se usa para generar datos aleatorios.El código simplemente alimenta datos aleatorios al
mozjpeg
compresor (en formato TGA, porque cjpeg lo entiende y tiene un encabezado muy simple), y le permite crear un archivo jpeg optimizado. La calidad se establece al máximo porque hace que los coeficientes DCT sean los menos compresibles, y no importa mucho qué algoritmo se use para comprimir datos no comprimibles.Verifiqué que el ciclo jpeg-> lepton-> jpeg no tiene pérdidas, es cierto.
El código no es golf, obviamente.
Imagen de ejemplo:
Dato curioso: el archivo JPEG generado es más grande que la imagen TGA sin comprimir de origen, aunque JPEG utiliza compresión con pérdida.
Dato curioso 2: Imgur (el alojamiento de imagen predeterminado para SO) hace un trabajo muy malo en este archivo; por alguna razón, lo vuelve a comprimir a una calidad inferior, aunque sea inferior a 1 MB. Entonces usé Github para cargar la imagen de ejemplo.
Dato curioso 3: en general, mozjpeg realmente hace una mejor compresión JPEG mientras se mantiene compatible con los decodificadores JPEG existentes. Y también tiene una herramienta para optimizar sin pérdida los archivos JPEG, también
jpegtran
.fuente
Ruido ingenuo, 1024 × 1024: puntuación 85.55%
Un ejemplo compatible en Python para que la pelota ruede. No optimizado de ninguna manera; probables deficiencias:
Entonces algo de fiesta para hacer la cosa:
fuente