Einführung des QOI-Bildkomprimierungsformats

Mit QOI (Quite OK Image) wurde ein neues leichtes, verlustfreies Bildkomprimierungsformat eingeführt, mit dem Sie Bilder in den Farbräumen RGB und RGBA sehr schnell komprimieren können. Beim Vergleich der Leistung mit dem PNG-Format ist die Single-Threaded-Referenzimplementierung des QOI-Formats in der C-Sprache, die keine SIMD-Anweisungen und Assembly-Optimierungen verwendet, in der Codierungsgeschwindigkeit 20–50-mal schneller als die Bibliotheken libpng und stb_image und 3 -4-mal schnellere Dekodierungsgeschwindigkeit. In Bezug auf die Komprimierungseffizienz liegt QOI in den meisten Tests nahe an libpng (in einigen Tests liegt es leicht vorn, in anderen ist es schlechter), aber im Allgemeinen liegt es deutlich vor stb_image (Gewinn von bis zu 20 %).

Die Referenzimplementierung von QOI in C umfasst nur 300 Codezeilen. Der Quellcode wird unter der MIT-Lizenz vertrieben. Darüber hinaus haben Enthusiasten Implementierungen von Encodern und Decodern in den Sprachen Go, Zig und Rust vorbereitet. Das Projekt wird von Dominic Szablewski entwickelt, einem Spieleentwickler mit Erfahrung in der Erstellung einer Bibliothek zum Dekodieren von MPEG1-Videos. Mit dem QOI-Format wollte der Autor zeigen, dass es möglich ist, eine effektive und einfache Alternative zu überkomplizierten modernen Bildkodierungsformaten zu schaffen.

Die QOI-Leistung ist unabhängig von der Auflösung und der Art des codierten Bildes (O(n)). Kodierung und Dekodierung werden in einem Durchgang durchgeführt – jedes Pixel wird nur einmal verarbeitet und kann auf eine von vier Arten kodiert werden, die abhängig von den Werten der vorherigen Pixel ausgewählt werden. Wenn das nächste Pixel mit dem vorherigen übereinstimmt, erhöht sich der Wiederholungszähler nur. Wenn das Pixel mit einem der Werte im 4-Pixel-Puffer übereinstimmt, wird der Wert durch einen 64-Bit-Offset zum vergangenen Pixel ersetzt. Wenn sich die Farbe des vorherigen Pixels geringfügig unterscheidet, wird der Unterschied in Kurzform angezeigt (kurze Kodierung der Unterschiede in den Farbkomponenten, die in 6, 2,4 und 5 Bit passen). Wenn die Optimierung nicht anwendbar ist, wird der vollständige RGBA-Wert bereitgestellt.

Source: opennet.ru

Kommentar hinzufügen