Короткий ответ
Нет, декодирование не всегда будет одинаковым. Тем не менее, различия гарантированно будут очень и очень небольшими.
Технические характеристики ISO
Спецификации Международной организации по стандартизации (ISO) для JPEG имеют следующие спецификации для декодеров (выделено мной):
Декодер должен
a) с соответствующей точностью преобразуют в восстановленные данные изображения любые сжатые данные изображения с параметрами в пределах диапазона, поддерживаемого приложением, и которые соответствуют синтаксису формата обмена, указанному в Приложении B для процесса декодирования (и) реализован декодером;
b) принимать и надлежащим образом хранить любые данные спецификации таблицы, которые соответствуют сокращенному формату для синтаксиса данных спецификации таблицы, указанному в Приложении B для процесса (ов) декодирования, осуществляемого декодером;
c) с соответствующей точностью преобразуют в восстановленные данные изображения любые сжатые данные изображения, которые соответствуют сокращенному формату для синтаксиса данных сжатого изображения, указанному в Приложении B для процесса (ов) декодирования, осуществляемого декодером при условии, что данные спецификации таблицы, необходимые для декодирования сжатых данных изображения, ранее были установлены в декодер.
Соответствующая точность очень строгая. Любой преобразователь, соответствующий этим спецификациям, должен сравниваться с эталонным алгоритмом. Для одного пикселя каждый компонент может отличаться только на один бит от эталонного. Кроме того, (квадрат) ошибка для каждого блока 8x8 пикселей и для всего изображения должна быть очень низкой.
Но с чего бы это было иначе?
В отличие от bmp или png, jpeg хранит не сами пиксели, а описание изображения. Для восстановления отдельных пикселей используется сложный математический алгоритм. После каждого шага алгоритм сохраняет результат в памяти. Здесь все может пойти не так: значение в памяти имеет определенную точность, точность машины . Из-за этого значение должно быть округлено. Хотя спецификации гарантируют, что используется минимальная точность, максимума нет. Таким образом, округление может быть различным для каждой реализации. Это может даже зависеть от используемого оборудования, так как некоторые процессоры используют больше битов точности, чем требуется. Некоторые ранние процессоры Pentium даже делали это неправильно.
Крошечный упрощенный пример: вычисление 5 * 0,12 путем многократного добавления.
Сохраняя промежуточные значения, используя одну цифру точности, компьютер может сделать это: 0,12 + 0,12 = 0,24, сохранить промежуточный результат как 0,2 (округление в меньшую сторону). Затем вычислите 0,2 + 0,12 = 0,32, сохраните как 0,3 (опять же, округлив вниз). Продолжайте эту модель, и результат будет 0,5 вместо ожидаемого результата 0,6. Если бы использовалась более высокая точность (например, две цифры), результат был бы другим.