2013-06-18 2 views
4

Иногда я сохраняю JPG-изображения в виде несжатого растрового изображения (BMP/PNG), чтобы сохранить качество при внесении изменений в изображение.Возможно ли перекодировать BMP из JPG обратно в JPG без потери качества?

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

Edit: Я думал, как-то грубой силы его, чтобы найти исходную информацию JPG настройки для этого блока данных BMP, и, таким образом, генерируя JPG из BMP (который был JPG раньше) без какой-либо разницы в оригинальном формате JPG , Я не знаю достаточно о формате JPG, чтобы сказать, даже если это возможно, но я не могу понять, почему нет, по крайней мере, в каком-то конечных времени вы можете скопировать 8x8 блок?

+2

Преобразование в jpeg является потерянным, даже если оно не видимым глазом. Используйте PNG вместо bmp. Вы получаете лучшее сжатие без потерь. – Gimmy

+1

@ Gimmy, вы пропустите момент. Прочтите весь вопрос? – Rookie

ответ

4

JPEG-сжатие является потерями, поэтому вы потеряете некоторую информацию в .bmp при повторном кодировании в виде JPEG. Если изображение тривиально (например, 1 черный пиксель1 черный, весь черный, например, 1 пиксель), вы можете перекодировать без потери.

Вы можете увидеть пример многократного кодирования JPEG here.

Вы можете сделать некоторые операции на JPEG, которые без потерь, из wikipedia:

ряд изменений в изображение JPEG может быть выполнена без потерь (то есть, без рекомпрессии и связанная с ним потеря качества) как длиннее, так как размер изображения кратен 1 блоку MCU (минимальный код единица) (обычно 16 пикселей в обоих направлениях, для 4: 2: 0 цветности 10 подвыборки). Утилиты, которые реализуют это, включают jpegtran, с пользовательским интерфейсом Jpegcrop и плагином JPG_TRANSFORM в IrfanView.

Блоки могут быть повернуты с шагом 90 градусов, перевернуты в горизонтальных, вертикальных и диагональных осях и перемещены по изображению. Не все блоки от исходного изображения должны использоваться в модифицированном .

Верхний и левый края изображения JPEG должны лежать на 8 × 8-пиксельном блоке , но нижний и правый края не должны этого делать. Это ограничивает возможные операции без потерь, а также предотвращает переворачивание и поворотов изображения, нижний или правый край которого не лежит на границе кадра для всех каналов (поскольку край будет располагаться сверху или слева, где - как упомянуто выше - граница блока обязательна).

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

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

Кроме того, несколько изображений JPEG могут быть без потерь объединены вместе, как , поскольку края совпадают с границами блоков.

+1

То, что я ищу, - это как-то «грубо заставить» его найти исходную информацию о блоке JPG для части (BMX) (8x8), тем самым преобразуя изображение BMP обратно в JPG без каких-либо различий. Когда я думаю об этом, я просто думаю, что это должно быть возможно - почему бы и нет? – Rookie

2

основой sbridges подробного ответа, и определенная часть вашего вопроса, я бы сказал Да.

(мне было интересно, это теоретически возможно перекодировать растровое обратно в исходный формат JPG, без потери качества, (для областей I отредактированных)? Кроме)

Я думаю, Однако главная проблема заключается в том, что вам нужно напрямую отредактировать JPEG. Вы теряете данные при редактировании блока. Таким образом, вы можете изменить его в BMP, чтобы отредактировать его, но тогда вам нужно будет отслеживать (или позже сравнивать и идентифицировать) пиксели, которые вы меняете. Затем вам нужно будет отредактировать эти конкретные блоки в JPEG и оставить все неотредактированные блоки нетронутыми. Таким образом, все неотредактированные блоки не будут иметь потери качества, но блоки, которые вы изменили, будут иметь потерю качества декодирования/изменения/перекодирования.

Из-за сложности фактического осуществления этого оно возможно, но оно может не стоить труда.

+0

Проблема здесь не в редактировании (я просто включил его здесь, чтобы показать полезность этого повторного кодирования). Вопрос в том, возможно ли это и, возможно, как? По крайней мере, было бы интересно. Неужели это так сложно? – Rookie

2

Теоретически возможно без потерь кодировать изображение BMP, известное из формата JPEG, в формате JPEG. То есть, вы можете сделать следующее преобразование:

JPEG A => BMP X -> JPEG B => BMP X

где => является операция декомпрессии и -> операция сжатия.

Обратите внимание, что это не довольно, что вы просите. Вы спрашиваете выше плюс, что JPEG A == JPEG B. Я сомневаюсь (но не знаю точно), что каждое JPEG-представление декодирует уникальный образ, поэтому я предполагаю, что эта гарантия не может быть выполнена.

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

Практический алгоритм вполне может существовать. Например, можно представить себе итеративный подход, например:

  1. Выберите начальные параметры сжатия (выборка и квантование цвета).
  2. Сжатие BMP изображение в кандидате JPEG.
  3. Decompress кандидат JPEG.
  4. Сравните декомпрессированное изображение с оригинальным BMP.
    • Если то же самое, выведите кандидат JPEG и завершите работу.
    • Если разные, обновлять параметры сжатия и возврат к шагу 2.

Хитрость бы на этом этапе обновления - выяснить, как изображение дифференциалы может направлять вас, чтобы улучшить параметры.

Возможно, вы сможете написать код, который будет работать в подавляющем большинстве случаев. Есть basically only 3 color sampling choices, и я думаю, что нет , что многие алгоритмы для генерации матриц квантования. Вы можете реализовать их все или, альтернативно, сканировать Интернет для файлов JPEG и записывать уникальные параметры сжатия. Тогда вы, скорее всего, потерпите неудачу в первую очередь на изображениях от новых компрессоров.

Важно отметить, что эти подходы зависят от использования одного и того же декомпрессора для операций =>, поскольку разные декомпрессоры могут не создавать один бит изображения для бит из одного файла JPEG.

1

В принципе, мы имеем дело с форматом изображения и сжатием здесь. Во-первых, давайте сосредоточимся на процессе, который позволяет конвертировать JPEG-образ в BMP. BMP формируется с отображением пикселей с значениями R.G.B. Таким образом, в терминах визуального аспекта и в терминах краев вы не должны наблюдать разницу между исходным изображением JPEG и преобразованием этого рисунка в BMP (проблемы с разрешениями разнесены).

Наоборот, как сказано другими участниками и здесь (http://en.wikipedia.org/wiki/JPEG), формат JPEG использует матрицу сжатия (DCT), которая каким-то образом изменит градиент вашего изображения.

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

Смежные вопросы