Как я могу добавить рамку к фотографии JPEG, не влияя на качество?

24

У меня есть фото в формате JPEG с разрешением 4680x3120. Я хочу добавить белую рамку вокруг этой фотографии, превратив ее в фотографию 5200x3467 (по причинам печати).

Понятно, что я ничего не изменяю и не удаляю с фотографии, я просто что-то добавляю. Следовательно, в принципе эта процедура может быть без потерь. Однако, если бы я использовал Paint, чтобы добавить эту рамку, процесс сохранения Paint снова сжимает фотографию в формат JPEG, тем самым теряя информацию и качество.

Есть ли способ (более профессиональная программа) добавить что-либо к фотографии в формате JPEG, например, рамку, не затрагивая оригинальную часть фотографии, не снижая ее качество?

LBogaardt
источник

Ответы:

35

Хотя ответ Филиппа - лучший способ, можно делать то, что вы хотите, полностью в сфере JPEG.

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

Мы можем воспользоваться этим фактом, чтобы без потерь добавить простую белую рамку к изображению. Нам просто нужно создать полый массив белых блоков, равный размеру выходного изображения, а затем поместить оригинальные блоки MCU JPEG в середину.

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

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

Самым простым готовым решением, которое мне известно, является плагин Better JPEG Lossless Resave для Photoshop. Он использует методы, основанные на идеях, приведенных выше, для копирования микроконтроллеров из исходного изображения, где это возможно, чтобы избежать их повторного создания из несжатой версии, как это обычно делает Photoshop.


Отступление:

  1. Вы можете подумать, что результирующая граница будет не совсем белой , поскольку потери в формате JPEG создадут некоторую разницу в цвете на выходе. Я провел некоторое тестирование, и, по крайней мере, в Photoshop, чисто белое изображение, сохраненное с помощью JPEG-файла 10-го уровня Save For Web (т.е. «низкого» качества), приводит к тому, что декодированное изображение остается чисто белым.

    Я определил это с помощью двух тестов:

    Сначала я загрузил JPEG в качестве слоя поверх оригинала, установил режим смешивания верхнего слоя на «Разница», затем добавил корректирующий слой «Уровни» над ним, чтобы попытаться увеличить различия. Полученное изображение оставалось черным, что означает «без разницы».

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

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

    Интересно, что это не происходит с чистыми черными блоками. По крайней мере, в реализации Photoshop они превращаются в RGB (1,1,1) при декодировании, а не в RGB (0,0,0).

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

  2. jpegtranявляется программой командной строки, но есть также программа Windows с графическим интерфейсом, основанная на том же самом коде jpegcrop.

  3. Увы, этот плагин предназначен только для Windows.

Уоррен Янг
источник
1
Я использовал программу под названием JPEG Wizard, которая предоставила такую ​​функциональность. У него также была очень хорошая возможность применять различные коэффициенты сжатия к разным частям JPEG. Таким образом, можно использовать высококачественную настройку для головы и рук человека, среднее качество для его одежды и более низкое качество для фона, и, таким образом, получится файл меньшего размера, но с более высоким общим качеством, чем если бы вы использовали среднее качество для всего.
суперкат
1
У меня не было возможности попробовать это, но этот пост в блоге предполагает, что jpegtranфункция обрезки может также использоваться для расширения. (Однако не уверен, какого цвета будут вытянутые границы.)
mattdm
4
@mattdm: Да, jpegtranможно также увеличить изображение, но оно всегда дополнено жестко закодированным средним серым, RGB (128,128,128). Он делает это просто потому, что это единственный простой вариант, поскольку в пространстве коэффициентов DCT это можно сделать с помощью простого bzero()вызова. Я попробовал дикий взлом изменить это , что не работает, но должно дать вам ощущение уродства. вскидывает руки в отчаянии
Уоррен Янг
@WarrenYoung: чтобы изменить цвет блоков заполнения, вам, вероятно, нужно изменить только первый (постоянный) коэффициент, а остальные оставить равным нулю. Конечно, коэффициенты сжаты, так что ... в любом случае, это должно быть выполнимо, но я согласен, что это не так тривиально, как может показаться.
Илмари Каронен,
2
Что касается вашего последнего замечания - наибольшая экономия достигается за счет выбрасывания высокочастотной информации. Выигрыш от отбрасывания точности цвета сплошного блока пикселей не может быть больше, чем один или два байта, так что это никогда или почти никогда не делается. Если есть какая-либо потеря информации, это в преобразовании цветового пространства YUV <-> RGB.
Хоббс
20

Важно помнить, что при сохранении фотографии в формате сжатия с потерями вы теряете качество . До тех пор, пока вы сохраняете фотографию в формате без потерь (PSD, TIFF и т. Д.) После добавления границы, вы не потеряете больше данных, чем уже потеряли, сохраняя фотографию в виде JPEG в первую очередь.

Филип Кендалл
источник
1
Спасибо. И это верно даже при использовании «дрянной» программы, такой как Paint, при сохранении ее, например, в TIFF?
Л.Богаардт
4
По крайней мере, согласно моему быстрому тесту, Paint использует алгоритм сжатия LZW без потерь при сохранении TIFF, поэтому он выглядит нормально.
Филипп Кендалл,
5
Имейте в виду, что это может значительно увеличить размер изображения ...
BlueRaja - Дэнни Пфлугхофт
2
Paint также поддерживает PNG, который также является форматом без потерь
phuclv
+1 за это, поскольку ответы, которые обсуждают сохранение обратно в jpeg, не совместимы со всеми вариантами кодирования jpeg.
Джеймс Снелл
6

Это не совсем без потерь, но вы можете быть довольно близко, используя GIMP (или другой редактор с похожей функцией) и следующие два трюка:

  1. Во-первых, убедитесь, что добавляемая граница кратна 8 пикселям (и, предпочтительно, кратна 16 пикселям).

    Это важно, потому что алгоритм сжатия JPEG разбивает изображение на блоки 8 × 8 пикселей *, начиная с верхнего левого угла, и применяет алгоритм сжатия с потерями независимо к каждому блоку. Таким образом, по крайней мере, в принципе, вы можете без потерь дополнить изображение JPEG, добавив полные блоки 8 × 8 пикселей вокруг существующих. Однако, если вы попытаетесь добавить рамку шириной не в целое число блоков, блоки в дополненном изображении не будут совпадать с блоками в оригинале, и некоторые потери сжатия будут неизбежны.

    *) На самом деле, большинство изображений JPEG используют подвыборку цветности , что означает, что только часть изображения в градациях серого фактически сжимается в 8 × 8 блоков, тогда как каналы цветности уменьшаются на 50% перед сжатием, что делает их эффективный размер блока 16 ×. 16 пикселей. Таким образом, для достижения наилучших результатов ширина вашей границы должна быть кратна 16 пикселям. Тем не менее, обычно вы можете обойтись границей в 8 (или 24, 40 и т. Д.) Пикселей, так как небольшая потеря сжатия в цветности не очень заметна.

  2. Вторая часть хитрости заключается в том, чтобы при сохранении окончательного изображения установить флажок «Использовать параметры качества из исходного изображения» в диалоговом окне « Экспорт изображения в JPEG» (в разделе «Дополнительные параметры»). Делайте это, даже если кажется, что это приведет к более низкому качеству, чем вы обычно используете!

    Этот параметр заставляет GIMP повторно использовать те же самые параметры сжатия, которые использовались для исходного изображения, что обычно устраняет около 99% потерь на сжатие, при условии, что вы не редактировали изображение слишком сильно, и, в частности, что блоки в новое изображение по-прежнему совпадает с оригиналом. (Иногда все еще будут некоторые потери из-за ошибок округления, но гораздо меньше, чем было бы в противном случае.)


В качестве быстрой демонстрации я взял это тестовое изображение JPEG от Wikimedia Commons , первоначально сохраненного с довольно низким качеством, равным 50, и добавил к нему причудливую (вроде) черно-белую рамку размером 8px, используя метод, описанный выше:

Тестовое изображение с 8px границей, в основном без потерь

Вот разница между исходным (15,1 кБ) и отредактированным изображением (16,7 кБ), показанным с использованием режима слоя GIMP «Извлечение зерна»:

Разница между дополненным изображением и оригиналом

Вы можете увидеть некоторые очень незначительные ошибки цветности, вызванные тем, что ширина границы не кратна 16, и (если вы посмотрите внимательно) несколько блоков, в которых также были незначительные потери в канале яркости из-за округления. Тем не менее, визуально, оригинал и дополненное изображение практически неразличимы, даже при 2-кратном увеличении и попеременном переключении между ними.

В частности, сопоставьте это с результатом повышения качества JPEG с 50 до 60 перед сохранением дополненного изображения, что дает следующее изображение размером 17,6 кБ:

Тестовое изображение с рамкой 8px, качество повышено с 50 до 60

При большом увеличении вы определенно можете увидеть, что отредактированное изображение в некоторых местах заметно размытее, чем оригинал, и разница с экстрактом зерна подтверждает это:

Разница между дополненным изображением (на q60) и оригиналом

Илмари Каронен
источник
«Установка этого флажка не влияет на настройку« Прогрессивный ».» Не ошибка, поскольку прогрессивная кодировка - это настройка кодирования, а не настройка качества. Jpegtran может конвертировать изображения в и из прогрессивного без потерь.
Дамиан Йеррик
@tepples: Ты прав; Я удалил этот абзац. По какой-то причине у меня сложилось впечатление, что переключение в прогрессивный режим приведет к тому, что настройки качества не будут совпадать, но быстрый тест, кажется, подтверждает, что я ошибался в этом.
Ильмари Каронен,
1
@thomasrutter: я не могу понизить комментарий, поэтому я просто укажу на исходное сообщение на форуме, описывающее эту функцию , и, в частности, на эту цитату: « Если вы только внесли несколько изменений в изображение, то повторно использование тех же таблиц квантования даст вам почти такое же качество, а размер файла - исходное изображение. Это сведет к минимуму потери, вызванные шагом квантования, по сравнению с тем, что произошло бы, если бы вы использовали разные таблицы квантования. "
Ilmari Karonen
1
Просто для сравнения, вот еще один пример в ответе на другой вопрос. Мое понимание в теории согласуется с Илмари, но, по крайней мере, в моем примере, практика, кажется, намного больше того, что говорит Томас - по крайней мере, когда начинаю с сильно ухудшенного образа. (Я думаю, что могильный камень служит плохим примером для этой цели, потому что потеря деталей на камне менее очевидна, чем на человеческой коже.)
mattdm
1
@mattdm: Кажется, это зависит от программного обеспечения; Я попытался воспроизвести результаты этого ответа в GIMP, и кажется, что GIMP (по крайней мере, версия 2.8.10) немного лучше сохраняет качество JPEG, чем ImageMagick (независимо от версии, которую вы тестировали). Ваше первое изображение, сохраненное один раз в q75, имеет PSNR 34,0298, в то время как одно из сохраненных дважды в q75 имеет одно из 32,8169 (а у восстанавливаемого 8 раз PSNR составляет 32,6459). Для сравнения, сохранение одного и того же исходного изображения в GIMP один раз в q75 дает PSNR 36,4560; открывая и сохраняя его с тем же качеством, оно лишь слегка падает до 36,3295.
Ильмари Каронен
3

Извините, если это не совсем то, что вы хотели, но ...

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

aaaaargZombies
источник
Обе действительные точки, спасибо. Тем не менее, я загрузил свою фотографию в один из тех онлайн-магазинов печати, так что я не могу контролировать сам принтер.
Л.Богаардт
1

Предыдущие ответы очень хорошие.

Я просто добавлю некоторые «психологические аспекты» формата jpg.

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

«Хорошее качество» - это процесс, а не только способ, которым формат файла сохраняет изображение. Да, вы повторно сжали файл с помощью jpg, потому что он вам действительно нужен. Если он находится в контролируемой ситуации, это нормально.

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

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

Вот мой список бесплатных программ, где вы действительно можете управлять сжатием JPG, и вариант, который вам нужно выбрать. (Все они в диалоговом окне сохранения JPG)

Irfanview - Включить отключение цветовой подвыборки.

FastStone Image Viewer - Цветовая подвыборка: Нет.

Gimp - субсэмплинг 4: 4: 4

Вывод. Не используйте Paint.

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

Рафаэль
источник
Кто-то проголосовал -1 за этот ответ. Обычно мне все равно, потому что я знаю, что могу сказать что-то глупое. В данном конкретном случае Какая часть ответа неверна?
Рафаэль
Я не голосовал (вверх или вниз), но вы, возможно, захотите поработать над написанием и грамматикой, чтобы создать лучшее первое впечатление (а также, если честно, чтобы ваш ответ было легче читать). Также на этот вопрос уже есть несколько ответов (и мой, тем более, получился довольно длинным); в какой-то момент некоторые люди могут начать отрицательно (или, по крайней мере, не голосовать) ответы, которые явно не добавляют что-то новое к существующим. Кроме того, попытайтесь структурировать свой ответ так, чтобы важные биты выделялись с первого взгляда; в этом случае выделенная жирным шрифтом единственная часть - это неважная сноска.
Ильмари Каронен
Спасибо за ваш комментарий Илмари. Я изо всех сил пытаюсь думать по-английски, так как это не мой родной язык. Я буду искать орфографический инструмент. Я не уверен, что есть грамматика. - Что касается второй части комментария, я понимаю, что логика StackExchange состоит в том, чтобы самостоятельно отвечать на вопрос, поскольку поток ответов не является фиксированным, поскольку они могут изменять порядок или редактироваться. Я посмотрю на это. (Я удалил жирный текст) Еще раз спасибо. : o)
Рафаэль
1
«он теряет только около 0,5% информации» [цитата нужна] :)
Уоррен Янг
Привет, Уоррен, вот оно: otake.com.mx/Apuntes/PruebasDeCompresion2/… Это на испанском языке, пожалуйста, сейчас используйте Google Translate, и мне нужно его обновить. На самом деле это меньше, чем 0,392% :)
Рафаэль
0

IrfanView хорошо работает для меня наборов изображений. Вот некоторые практические заметки

Вот моя хранимая процедура для вставки границы - Процедура Infran для добавления границы

  1. Щелкните правой кнопкой мыши изображение, «Открыть с помощью» -> «InfranView»
  2. Нажмите «б»
  3. Установите флажок «Использовать дополнительные параметры» в левом верхнем углу, нажмите «Дополнительно»
  4. Проверьте «Размер холста», нажмите «Настройки»
  5. Введите ширину каждой границы (Левая сторона, Правая сторона, Верхняя сторона, Нижняя сторона)
  6. Нажмите «ОК»
  7. Выберите «Перезаписать существующие файлы»
  8. Нажмите «ОК»
  9. Введите выходной каталог «Выходной каталог для файлов результатов:»
  10. Перейдите и дважды щелкните изображение, чтобы добавить рамку в верхний список. Это добавит его в список «входные файлы:» внизу списка
  11. Нажмите «Начать пакет»
J-Dizzle
источник
1
Не могли бы вы объяснить, что же такого особенного в этом методе, чтобы он отвечал требованиям постера не снижать качество изображения? При первом прочтении, это, похоже, отправляет JPEG через весь цикл распаковки-повторного сжатия, которого пытается избежать постер.
Филипп Кендалл,
хммм, вы привели интересный момент в отношении жизненного цикла образа через процесс, который я здесь перечислил, я не думал об этом. Вы можете быть правы, если вы хотите, чтобы я удалил или исправил мою публикацию, пожалуйста, дайте мне знать :)!
J-Dizzle