Kurze Antwort
Nein, es ist nicht garantiert, dass die Decodierung immer gleich ist. Die Unterschiede sind jedoch garantiert sehr, sehr gering.
ISO-Spezifikationen
Die ISO-Spezifikationen (International Organization for Standardization) für JPEG enthalten die folgenden Spezifikationen für Decoder (Hervorhebung von mir):
Ein Decoder muss
a) mit angemessener Genauigkeit alle komprimierten Bilddaten in rekonstruierte Bilddaten konvertieren mit Parametern innerhalb des von der Anwendung unterstützten Bereichs, die der in Anhang B angegebenen Austauschformatsyntax für die vom Decodierer verkörperten Decodierungsprozesse entsprechen;
b) alle Tabellen akzeptieren und ordnungsgemäß speichern Spezifikationsdaten, die dem abgekürzten Format für die Syntax der Tabellenspezifikationsdaten entsprechen, das in Anhang B für die vom Decodierer verkörperten Decodierungsprozesse angegeben ist;
c) mit angemessener Genauigkeit konvertieren zum Rekonstruieren von Bilddaten alle komprimierten Bilddaten, die dem abgekürzten Format für die angegebene Syntax für komprimierte Bilddaten entsprechen in Anhang B für die vom Decodierer verkörperten Decodierungsprozesse, vorausgesetzt, dass die zum Decodieren der komprimierten Bilddaten erforderlichen Tabellenspezifikationsdaten zuvor in den Decodierer installiert wurden.
Angemessene Genauigkeit ist sehr streng. Jeder Konverter, der diesen Spezifikationen folgt, muss mit einem Referenzalgorithmus verglichen werden. Für ein einzelnes Pixel kann sich jede Komponente nur um ein Bit von der Referenz unterscheiden. Darüber hinaus muss der (quadratische) Fehler über jeden 8x8-Pixelblock und über das gesamte Bild sehr gering sein.
Aber warum sollte er anders sein?
Im Gegensatz zu bmp oder png speichert ein JPEG nicht die Pixel selbst, sondern eine Beschreibung des Bildes. Zur Rekonstruktion der einzelnen Pixel wird ein komplexer mathematischer Algorithmus verwendet. Nach jedem Schritt speichert der Algorithmus das Ergebnis im Speicher. Hier kann etwas schief gehen: Ein Wert im Speicher hat eine bestimmte Genauigkeit, die Maschinengenauigkeit. Aus diesem Grund muss der Wert gerundet werden. Während die Spezifikationen sicherstellen, dass eine minimale Präzision verwendet wird, gibt es kein Maximum. Die Rundung kann daher für jede Implementierung unterschiedlich sein. Dies kann sogar von der verwendeten Hardware abhängen, da einige Prozessoren mehr Präzision als erforderlich verwenden. Einige frühe Pentium-Prozessoren haben es sogar einfach falsch gemacht.
Winziges, stark vereinfachtes Beispiel: Berechnen von 5 * 0,12 durch wiederholte Addition.
Speichern von Zwischenwerten mit einer Genauigkeit, ein Computer könnte dies tun : 0,12 + 0,12 = 0,24, Zwischenergebnis als 0,2 speichern (Abrunden). Berechnen Sie dann 0,2 + 0,12 = 0,32 und speichern Sie sie als 0,3 (erneut abgerundet). Setzen Sie dieses Muster fort und das Ergebnis ist 0,5 anstelle des erwarteten Ergebnisses von 0,6. Wenn eine höhere Genauigkeit verwendet worden wäre (z. B. zwei Ziffern), wäre das Ergebnis unterschiedlich gewesen.