Codec-Vergleich

Vollständiger Messbericht: 14 unabhängige Fotos, drei Betriebspunkte, fünf Verfahren. Jede Baseline wurde auf exakt die Byte-Zahl von KARC getrimmt, erst danach wurde die Qualität...

Testbericht · 13.08.2026

Codec-Vergleich bei gleicher Byte-Zahl

Vollständiger Messbericht: 14 unabhängige Fotos, drei Betriebspunkte, fünf Verfahren. Jede Baseline wurde auf exakt die Byte-Zahl von KARC getrimmt, erst danach wurde die Qualität verglichen.

Erzeugt: 2026-08-13 09:49:37 · Testsatz: clic20v, 14 Bilder · Betriebspunkte: 3

Fragestellung

Wie viel Bildqualität liefern die Verfahren, wenn alle exakt gleich viele Bytes verbrauchen dürfen? Das ist die Frage, die in der Praxis zählt — nicht, wer bei frei gewählter Qualitätsstufe zufällig besser aussieht.

Methodik

  1. Jedes Bild wird mit KARC kodiert. Maßgeblich ist die echte Byte-Zahl aus der Datei, kein Schätzwert.
  2. Jede Baseline wird per Bisektion über ihre Qualitätsstufe auf genau diese Byte-Zahl getrimmt.
  3. Erst dann werden PSNR und MS-SSIM gegen das Original gemessen.

Genommen wird jeweils der Kandidat mit dem kleinsten Byte-Abstand zum Ziel — ober- wie unterhalb. Würde man „nie mehr Bytes als KARC" fordern, bekämen die Baselines bei grober Qualitätsstufung teils deutlich weniger Bytes und sähen künstlich schlechter aus.

Welche Byte-Zahl verglichen wird — und warum das hier entscheidend ist

Verglichen wird die reine Codec-Nutzlast, nicht die volle Dateigröße. Der .karc-v2-Container enthält zusätzlich eine eingebettete Vorschau. Bei Bildern dieser Größe ist die überraschend groß — siehe die Tabelle weiter unten. Nimmt man die volle Datei als Ziel, bekommen die Baselines für die eigentlichen Bilddaten bis zu doppelt so viele Bytes wie KARC; gemessen wird dann nicht mehr die Codec-Qualität, sondern der Vorschau-Aufschlag.

Ein erster Durchlauf dieses Tests hatte genau diesen Fehler und ließ KARC dadurch gegen AVIF verlieren. Der Fehler fiel auf, weil die gemessene Bitrate deutlich über der aus dem offiziellen Benchmark lag — bei identischem PSNR.

Testsatz: clic20v — Bilder, auf denen das Modell nicht trainiert wurde.

Baseline-Einstellungen:

  • AVIF — Pillow/libaom speed=4
  • WebP — Pillow/libwebp method=6
  • JPEG 2000 — Pillow/OpenJPEG quality_mode=rates
  • JPEG — Pillow/libjpeg optimize=True

Ergebnis

Mittelwerte über alle 14 Bilder. Δ = KARC minus Baseline, positiv bedeutet KARC besser.

Betriebspunkt λ = 0.0067 (im Mittel 0.3431 bpp, 37556 Byte je Bild)

Verfahren Ø Bytes Ø PSNR Ø MS-SSIM Δ PSNR Δ MS-SSIM KARC besser bei
KARC 37556 32.31 dB 0.9762
AVIF 37330 30.71 dB 0.9786 +1.60 dB -0.0024 14/14 Bildern
WebP 37414 29.36 dB 0.9683 +2.95 dB +0.0079 14/14 Bildern
JPEG 2000 37700 27.15 dB 0.9240 +5.16 dB +0.0521 14/14 Bildern
JPEG 37443 27.38 dB 0.9487 +4.92 dB +0.0275 14/14 Bildern

Betriebspunkt λ = 0.013 (im Mittel 0.4892 bpp, 53466 Byte je Bild)

Verfahren Ø Bytes Ø PSNR Ø MS-SSIM Δ PSNR Δ MS-SSIM KARC besser bei
KARC 53466 33.85 dB 0.9850
AVIF 53881 32.21 dB 0.9866 +1.64 dB -0.0016 14/14 Bildern
WebP 53432 30.77 dB 0.9796 +3.08 dB +0.0054 14/14 Bildern
JPEG 2000 53289 28.19 dB 0.9422 +5.66 dB +0.0428 14/14 Bildern
JPEG 53340 28.87 dB 0.9692 +4.98 dB +0.0158 14/14 Bildern

Betriebspunkt λ = 0.025 (im Mittel 0.6626 bpp, 72353 Byte je Bild)

Verfahren Ø Bytes Ø PSNR Ø MS-SSIM Δ PSNR Δ MS-SSIM KARC besser bei
KARC 72353 35.38 dB 0.9902
AVIF 73178 33.55 dB 0.9913 +1.83 dB -0.0011 14/14 Bildern
WebP 72518 32.23 dB 0.9862 +3.15 dB +0.0040 14/14 Bildern
JPEG 2000 72501 29.30 dB 0.9557 +6.09 dB +0.0345 14/14 Bildern
JPEG 72450 30.19 dB 0.9810 +5.19 dB +0.0091 14/14 Bildern

Nebenbefund: die eingebettete Vorschau ist zu groß

Beim Aufsetzen dieses Tests fiel auf, wie viel des .karc-Containers gar nicht auf die Bilddaten entfällt:

Anteil der Vorschau an der Gesamtdatei
Mittel 34.5 %
Kleinster Wert 11.8 %
Größter Wert 82.1 %

Im Mittel entfällt also gut ein Drittel der Datei auf ein Vorschaubild, im Extremfall über vier Fünftel — dort ist die eigentliche Bildinformation nur noch ein Sechstel der Datei. Der Effekt trifft kleine Dateien am härtesten, weil die Vorschau kaum mit der Bitrate schrumpft.

Für die Codec-Bewertung ist das irrelevant. Für die Produktgröße ist es der mit Abstand größte Hebel, den dieser Testlauf zutage gefördert hat — und er wirkt sofort, unabhängig von jeder Modellverbesserung.

Wie genau wurde die Byte-Zahl getroffen?

| Verfahren | Ø |Abweichung| | größte Abweichung | |---|---:|---:| | AVIF | 1.90 % | 4.64 % | | WebP | 0.62 % | 1.81 % | | JPEG 2000 | 0.57 % | 1.98 % | | JPEG | 1.23 % | 4.16 % |

Die Qualitätsstufen der Baselines sind ganzzahlig; ein exakter Byte-Treffer ist deshalb nicht immer möglich. Die tatsächlich erreichte Byte-Zahl steht bei jedem Messwert in daten/messwerte.json und auf jeder Vergleichstafel.

Geschwindigkeit (KARC, CPU)

Kodieren im Mittel 5.6 s, Dekodieren 5.5 s je Bild. Der Codec lief hier bewusst auf der CPU, damit parallel ein GPU-Training ungestört weiterlaufen konnte.

Einzelmessungen, Betriebspunkt λ = 0.013

Damit jede Mittelwert-Angabe oben nachrechenbar ist — PSNR in dB je Foto und Verfahren:

Foto Byte (Bilddaten) KARC AVIF WebP JPEG 2000 JPEG
clic20v_01 19867 36.27 34.71 33.12 31.51 30.19
clic20v_02 124442 29.73 28.55 27.13 24.59 25.55
clic20v_03 58120 33.85 31.71 29.83 25.87 27.68
clic20v_04 62103 32.55 30.25 28.95 27.72 27.61
clic20v_05 47825 34.97 32.61 30.62 26.89 28.32
clic20v_06 25791 36.12 34.62 33.67 31.39 31.69
clic20v_07 90667 31.55 30.44 29.70 27.29 28.61
clic20v_08 75009 30.60 29.55 28.48 25.40 27.17
clic20v_09 38873 34.83 33.89 32.25 28.11 30.53
clic20v_10 70803 31.85 29.89 28.28 27.34 27.07
clic20v_11 4283 37.10 34.81 33.77 31.13 31.10
clic20v_12 55758 33.34 31.70 30.23 29.03 29.18
clic20v_13 16901 37.87 36.55 34.10 30.99 30.59
clic20v_14 58080 33.28 31.71 30.64 27.44 28.90

Was in diesem Ordner liegt

Pfad Inhalt
vergleichstafeln/ Eine A4-Tafel je Bild und Betriebspunkt (quer, 300 dpi, druckfertig)
bilder/ .karc-Dateien und dekodierte PNGs einer Auswahl
daten/messwerte.json Alle Einzelmessungen mit Methodik-Vermerk
daten/messwerte.csv Dieselben Daten als Tabelle

Dateibenennung der Tafeln:

<datensatz>_<nr>_mse-l<lambda>_ausschnitt_x<X>-y<Y>-<kante>px_A4quer300dpi.png

x/y ist die Position des gezeigten Ausschnitts im Originalbild, kante seine Größe in Bildpunkten. Der Ausschnitt wird automatisch dorthin gelegt, wo das Bild am detailreichsten ist — ein fester Mittenausschnitt trifft sonst oft Himmel oder Unschärfe und zeigt zwischen den Verfahren gar nichts.

Neu erzeugen

python samples/tests/vergleich_lauf.py --out samples/tests/<datum>_codecvergleich \
    --lambdas 0.0067,0.013,0.025
python samples/tests/vergleich_bericht.py --lauf samples/tests/<datum>_codecvergleich