
Допустим, у меня есть версия изображения без потерь, которая ранее была сжата в формате JPEG (например, если вы откроете изображение JPEG в MS Paint и сохраните его как BMP, я знаю, что некоторые метаданные будут потеряны в этом процессе, но это не мое дело).
Я хотел бы узнать, возможно ли это и как преобразовать его обратно в формат JPEG без потери качества изображения, то есть чтобы каждый пиксель был абсолютно одинаковым?
РЕДАКТИРОВАТЬ:Я полностью понимаю, что преобразование изображения JPEG в формат без потерь не даст мне никакого дополнительного качества. Я спрашиваю об этом, потому что: У меня есть файл PNG, извлеченный из файла SWF. Первоначально (в файле SWF) объект был изображением JPEG + альфа-канал, размер файла которого намного меньше по сравнению с файлом PNG, который у меня есть. Мне нужен исходный формат (JPEG + альфа-канал), но у меня больше нет копий исходного файла SWF (и я не смог найти ни одной в сети), поэтому я не могу повторить процесс извлечения.
решение1
По сути, вы спрашиваете, можно ли обратить процесс декодирования изображения 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, однако крайне маловероятно, что какая-либо реконструкция будет побайтовой копией (без учета метаданных) исходного файла, поскольку информация была потеряна в процессе декодирования.
решение2
JPEG — это формат с потерями, и нет способа обойти это. Даже при качестве сжатия 100 коэффициент сжатия все равно составляет 2,6:1 (Википедия JPEG).
Было предложено несколько вариантовJPEG без потерь, например JPEG 2000, но они не прижились и их поддержка очень плохая.
Лучше всего конвертировать в формат без потерь, например PNG, который все еще сжимает, но без потерь.
решение3
Если вы откроете изображение JPEG в любом редакторе и сохраните его как BMP, вы не получите больше качества, чем то, что уже доступно в вашем .jpg
файле. Это было бы похоже на конвертацию файла mp3 с низким битрейтом (например, 128kbps) в гораздо лучший формат, например flac
, в надежде, что каким-то образом качество волшебным образом восстановится. Этого не произойдет.
Информация была утеряна, когда вы впервые сохранили изображение в формате JPG, как и сказал harrymc; восстановить эту информацию из этого файла JPG невозможно.
Сжатие с потерями является «деструктивным» или также известным как «необратимое». Смотритеhttps://en.wikipedia.org/wiki/Lossy_compression.
решение4
Информация почти наверняка была потеряна при конвертации в JPEG. Конвертация этого файла в BMP сохранит информацию, хранящуюся в JPEG, но конвертация BMP обратно в JPEG, вероятно, приведет к потере еще большей информации