Можно ли конвертировать JPEG в формат без потерь и конвертировать обратно без потери качества?

1536
RadarNyan

Скажем, у меня есть версия изображения без потерь, которая ранее была сжата в формате JPEG (например, если вы откроете изображение JPEG в mspaint и сохраните его как BMP, я знаю, что некоторые метаданные будут потеряны в этом процессе, но это не моя проблема)

Я хотел бы знать, возможно ли это и как преобразовать его обратно в формат JPEG, не теряя при этом качества изображения, а это значит, что каждый пиксель точно такой же?

РЕДАКТИРОВАТЬ: Я полностью понимаю, что преобразование изображения JPEG в формат без потерь не даст мне никакого дополнительного качества. Я спрашиваю об этом, потому что: у меня есть файл PNG, извлеченный из файла SWF. Первоначально (в SWF-файле) объект представлял собой изображение JPEG + альфа-канал, размер файла которого намного меньше по сравнению с имеющимся у меня файлом PNG. Мне нужен оригинальный формат (JPEG + альфа-канал), но у меня больше нет копий исходного SWF-файла (и я тоже не смог найти его в Интернете), поэтому я не могу повторить процесс извлечения.

2
Это действительно ваше понимание или вы хотите сделать это (и если да, то почему)? Dave 6 лет назад 0
Я до сих пор не понимаю твою проблему - но **, как правило, любое (дальнейшее) кодирование с потерями снижает качество ** - это только лучший вариант, который не может быть достигнут без особых усилий (ручная настройка -настройка параметров, используя "лучшие" инструменты, ...), чтобы получить то же качество от сжатия с потерями. А так как JPEG не предлагает большой тонкой настройки ... Итак, ответ: ** нет **. Тем не менее, возможно, что дальнейшая потеря качества не будет заметна - но это то, что вы должны попробовать, потому что это действительно зависит от используемых форматов (кодировщиков), рассматриваемой картинки и варианта использования. flolilolilo 6 лет назад 1

4 ответа на вопрос

3
harrymc

JPEG - формат с потерями, и нет никакого способа обойти это. Даже при уровне сжатия 100 степень сжатия по-прежнему составляет 2,6: 1 ( Wikipedia JPEG ).

Было предложено несколько вариантов для Lossless JPEG, таких как JPEG 2000, но они не завоевали популярность и их поддержка очень плохая.

Вам лучше конвертировать в формат без потерь, такой как PNG, который все еще сжимает, но без потерь.

Обычно да, хотя в процессе jpg -> png -> jpg теоретически должно быть возможно, чтобы процесс png -> jpg применил тот же метод сжатия, что и исходный jpg. Однако на практике это практически невозможно сделать специально. Кроме того, если редактирование было даже незначительным, то это почти всегда приводит к тому, что второе сжатие jpg пытается сжать артефакты jpg первого сжатия, которые больше не выстраиваются должным образом. BeowulfNode42 6 лет назад 1
3
Liam

По сути, вы спрашиваете, можно ли изменить процесс декодирования изображения JPEG. Это совсем другое намерение, чем у обычного кодера JPEG, и я не знаю ни о каком программном обеспечении, которое выполняет это. Математически это возможно * до тех пор, пока к изображению не было применено преобразование или другая модификация после того, как оно было закодировано, но насколько сложно это может быть программно?

Первая проблема - это цветовое пространство - JPEG использует субсэмплирование (цвет, сэмплированный по группе пикселей) yCbCr, тогда как растровое изображение - RGB. Неизбежные потери при преобразовании между этими цветовыми пространствами (а также при любой гамма-коррекции) создают шум. Вторая проблема, которую нужно решить, это то, что JPEG записывает данные изображения в виде макроблоков (подизображений размера NxN), которые должны быть выведены из выходного изображения декодера. Более подробное объяснение формата JPEG и процесса кодирования можно найти здесь http://www.guillermito2.net/stegano/jsteg/

«расшифровка» JPEG:

Чтобы создать аппроксимацию исходных данных JPEG, нам нужно найти подвыборку, размер и выравнивание макроблоков и коэффициенты дискретного косинусного преобразования (DCT), которые использовались для их кодирования. Остальное идентично обычному процессу кодирования JPEG. Одна наивная реализация, которая приходит на ум, это «образованное предположение и проверка»: предположим, что для создания изображения использовались некоторые распространенные реализации JPEG, и пытайтесь применять их до тех пор, пока не будет обнаружено, что в DCT получаются «похожие на JPEG» результаты (обычно нули для высокие частоты).

После этого выполните точную настройку коэффициентов для минимальной ошибки по сравнению с оригиналом (т. Е. Растровое изображение сжатого изображения). Этот процесс все еще приведет к компромиссу между ошибкой и размером файла, но он должен быть достаточно близок для практических целей.

Источник : Предыдущая работа по проверке видеокодеков DNx и ProRes, которые применяют кодирование в стиле JPEG к каждому отдельному кадру (программное обеспечение реверсирования декодированных кадров было бы очень интересным и потенциально полезным побочным проектом).

* Существует набор входных данных, которые будут выдавать идентичные выходные данные при прохождении через оригинальный декодер JPEG, однако для любой реконструкции крайне маловероятно, чтобы любая реконструкция была побайтной копией (игнорируя метаданные) исходного файла, поскольку информация была потеряна во время декодирования. процесс.

0
Marc.2377

Если вы откроете изображение JPEG с помощью любого редактора и сохраните его как BMP, вы не получите больше качества, чем то, что уже доступно в вашем .jpgфайле. Это все равно что конвертировать mp3-файл с низким битрейтом (например, 128 кбит / с) в гораздо лучший формат, например flac, надеясь, что каким-то образом качество будет волшебным образом восстановлено. Не будет

Информация была потеряна, когда вы впервые сохранили изображение в jpg, как сказал harrymc; нет никакой возможности получить эту информацию из этого файла jpg.

Сжатие с потерями является «разрушительным», или также известно как «необратимое». Смотрите https://en.wikipedia.org/wiki/Lossy_compression .

0
PiedPiper

Информация почти наверняка была потеряна при конвертации в JPEG. Преобразование этого файла в BMP сохранит информацию, хранящуюся в JPEG, но преобразование BMP обратно в JPEG, вероятно, приведет к потере еще большей информации.

Похожие вопросы