Gemaunze

JPEG besser als WebP?

WebP zählt als modernes Bildformat. Als Fotograf muss ich leider sagen: It fucking sucks!

WebP bügelt sämtliche Mikrokontraste aus Bildern. Die Textur, das Grain, der Grit gehen völlig verloren. Wer bin ich, dass ich so was behaupten darf? Vor langer Zeit (ach Gott, Opa erzählt von seiner Jugend), als die GD-Erweiterung noch nicht zum PHP-Standard gehörte, programmierte ich einen JPEG-Codec mitsamt bikubischer Skalierung in jener antiken Programmiersprache namens ANSI C, damit mein CMS (heute NUOS Web Platform) Bilder automatisch in die gewünschte Auflösung umrechnet. Das habe ich dann für Linux in 32 und 64 Bit sowie Windows kompiliert. Und ich nutze es auch 2026 noch als Fallback!

Und dann habe ich auch noch Videos gemacht. Und auch dort merkte ich schnell die Unterschiede zwischen verschiedenen verlustbehafteten Komprimierungsverfahren (H.264 vs. VP8 <=> JPEG vs. WebP). Um dem Wahnsinn noch die Krone aufzusetzen, möchte ich eine Funktion aus NUOS zitieren:

function image_quality($width,
                       $height,
                       $extension)
{
        //quality
        static $quality = array("webp" => array("min" => 90, "mid" => 90, "max" => 95),
                                "jpg"  => array("min" => 85, "mid" => 85, "max" => 90));

        //resolution
        static $rmin = 5760; //sqrt(7680 * 4320)
        static $rmid = 1440; //sqrt(1920 * 1080)
        static $rmax =  240; //sqrt( 320 *  180)

        //quality points for image format
        $q    = $quality[$extension];
        $qmin = $q["min"];
        $qmid = $q["mid"];
        $qmax = $q["max"];

        //image diagonal
        $diagonal = sqrt($width * $height);
        $diagonal = max($rmax, min($rmin, $diagonal)); //clamp

        //normalize t
        $t    = ($diagonal - $rmax) / ($rmin - $rmax);
        $tmid = ($rmid - $rmax) / ($rmin - $rmax);

        //control point
        $d = 2 * (1 - $tmid) * $tmid; //denominator
        $c = ($d == 0) ? $qmid : ($qmid - pow(1 - $tmid, 2) * $qmax - pow($tmid, 2) * $qmin) / $d;

        //quadratic bezier interpolation
        $u     = 1 - $t; //complementary parameter
        $value = $u * $u * $qmax + 2 * $u * $t * $c + $t * $t * $qmin;

        return (int)round($value);
};


Darin bestimme ich die Qualitätsstufe der WebP- und der JPEG-Komprimierung fließend mittels einer Bezierkurve in Abhängigkeit von der Bilddiagonale. Das ist mein Kompromiss zwischen respektvollem Umgang mit Bildmaterial und der Dateigröße.

Bei JPEG ist die Erreichung der Komprimierung im Gegensatz zu WebP nicht standardisiert. Das bedeutet, dass verschiedene JPEG-Encoder sehr unterschiedliche Ergebnisse erzielen können. Wovon ich hier ausgehe, ist der Encoder, auf den es in der Praxis ankommt, einfach weil er verfügbar ist: die GD-Erweiterung von PHP.

Meine Einschätzung ist so einfach wie vernichtend: JPEG sieht bei gleicher Dateigröße um Klassen besser aus, sofern man authentisches Fotomaterial verwendet. Bei der Programmierung meines JPEG-Codecs hatte ich bereits mit verschiedenen Möglichkeiten experimentiert, die Dateigröße durch Flächenglättung zu verringern – etwas, das ein integraler Bestandteil von WebP ist. Dabei konnte ich mit JPEG bei wesentlich geringerer Dateigröße ähnliche Ergebnisse erzeugen wie heutzutage mit WebP. Trotzdem habe ich mich dagegen entschieden und letztendlich die Defaults der JPEG-Norm übernommen, weil es bei zu starker Detailglättung künstlich und „billig“ wirkte.

Kurz: Ist WebP das überlegene Bildformat? Nein, definitiv nicht! Nutze ich trotzdem WebP? Ja, manchmal. Es ist ein eigener Look. Rein von der Dateigröße tut es sich nichts mit JPEG, aber es hängt vom Projekt und der beabsichtigten Aussage ab, welcher „Taste“ besser passt.

0 Kommentar(e)

Kommentar schreiben




Wird nicht veröffentlicht.