12 puntos por xguru 2021-11-25 | 3 comentarios | Compartir por WhatsApp
<p>"Quite OK Image" <br /> - Ejecuta compresión RGB/RGBA con un tamaño similar a PNG<br /> → la compresión es 20x-50x más rápida, y la descompresión es 3~4x más rápida <br /> → código C de código abierto en un archivo de cabecera único de 300 líneas <br /> → implementación simple de un solo hilo sin usar SIMD <br /> - Detalles técnicos <br /> → codificación/decodificación de imagen en una sola pasada <br /> → toca cada píxel solo una vez, y cada píxel se codifica de una de 4 maneras <br /> ⇨ si es igual al píxel inmediatamente anterior, aumenta la longitud de ejecución del píxel anterior; si es diferente, empaqueta el nuevo píxel con uno de los otros 3 métodos <br /> ⇨ si es igual a un píxel procesado anteriormente, usa el índice de ese píxel. Para esto mantiene un arreglo de los 64 píxeles más recientes<br /> ⇨ si no hay mucha diferencia respecto al píxel anterior, guarda ese valor de diferencia RGBA <br /> ⇨ si los 3 métodos anteriores fallan, guarda el valor RGBA del píxel. Pero solo guarda las partes diferentes respecto al píxel anterior </p>

3 comentarios

 
lifthrasiir 2021-11-25
<p>Dicho con algo de exageración, QOI es básicamente PNG sin `zlib`, dejando solo el filtrado y mejorándolo.<br /> <br /> Aunque el algoritmo de compresión `zlib`/`gzip`/`DEFLATE` que también usa PNG se ha utilizado mucho, ya es bastante antiguo y su eficiencia se queda corta; además, los algoritmos de la familia LZ77, incluido `zlib`, parten de la suposición básica de que “entre los bytes recientes aparecen varios casos donde secuencias continuas de bytes son iguales” (por ejemplo, si la entrada es "to be or not to be", aprovechan que la parte "to be" aparece dos veces). Pero las imágenes son un tipo de dato donde esa suposición no funciona muy bien, así que PNG en la práctica usa `zlib` solo para codificación entrópica (un enfoque que comprime según la probabilidad de que aparezca el siguiente byte, sin contexto adicional), y como etapa de preprocesamiento aplica un filtrado simple para intentar que los datos que entran a `zlib` se ajusten lo más posible a esa suposición, aunque en realidad no se puede decir que sea muy eficiente.<br /> <br /> Los formatos modernos de imagen sin pérdida mejoran esto principalmente de dos maneras: una es mejorar la predicción de píxeles que corresponde al filtrado de PNG (por ejemplo, aumentando mucho los tipos de filtrado o aplicando filtrados distintos a diferentes partes de la imagen), y la otra es mejorar la codificación entrópica que corresponde al `zlib` de PNG. El enfoque de QOI es similar, pero se caracteriza por dos cosas para mantener la simplicidad: no usa en absoluto el píxel situado encima de la posición actual en la predicción de píxeles, y renuncia a la codificación entrópica para preparar varios esquemas de codificación de diferencias (`delta`) basados en la experiencia. En particular, por la primera característica, independientemente del rendimiento al comprimir o descomprimir, su tasa de compresión suele ser inferior a la de PNG, aunque parece posible mejorar eso sacrificando un poco de simplicidad.</p>
 
xguru 2021-11-25
<p>Oh, gracias por la explicación adicional. Está interesante.</p>
 
xguru 2021-11-25
<p>Quizás sea difícil usarlo para reemplazar otros formatos, pero el código es simple y la implementación está bien explicada, así que parece un código entretenido de leer.<br /> https://github.com/phoboslab/qoi/blob/master/qoi.h<br /> </p>