Хотя ответ Филиппа - лучший способ, можно делать то, что вы хотите, полностью в сфере JPEG.
JPEG работает, разбивая ваше изображение на блоки, называемые минимальными единицами кодирования (MCU), обычно 16 × 16 каждый, и сжимая их отдельно. Вы можете видеть это на изображениях, когда вы повышаете уровень сжатия очень высоко. При более разумных уровнях сжатия блоки смешиваются так плавно, что вы никогда не увидите границ.
Мы можем воспользоваться этим фактом, чтобы без потерь добавить простую белую рамку к изображению. Нам просто нужно создать полый массив белых блоков, равный размеру выходного изображения, а затем поместить оригинальные блоки MCU JPEG в середину.
У этого метода есть недостаток: он работает только тогда, когда размеры входного и выходного изображений кратны размеру MCU. Если это не так, нам нужно повторно сжать некоторые блоки на полях между белой рамкой и краями исходного изображения. Вы не увидите этой разницы в выходных данных, если будете держаться подальше от чрезмерно высоких уровней сжатия JPEG, поэтому он по-прежнему эффективно без потерь.
Я не знаю ни одной программы, которая делает только это. Самая близкая вещь, о которой я знаю, это то, что выполняет обратную операцию: в jpegtran есть функция обрезки, которая без потерь обрезает части краев изображения. Это достигается путем отбрасывания обрезанных микроконтроллеров по краям изображения, оставляя те в середина нетронута.
Самым простым готовым решением, которое мне известно, является плагин Better JPEG Lossless Resave для Photoshop. Он использует методы, основанные на идеях, приведенных выше, для копирования микроконтроллеров из исходного изображения, где это возможно, чтобы избежать их повторного создания из несжатой версии, как это обычно делает Photoshop.
Отступление:
Вы можете подумать, что результирующая граница будет не совсем белой , поскольку потери в формате JPEG создадут некоторую разницу в цвете на выходе. Я провел некоторое тестирование, и, по крайней мере, в Photoshop, чисто белое изображение, сохраненное с помощью JPEG-файла 10-го уровня Save For Web (т.е. «низкого» качества), приводит к тому, что декодированное изображение остается чисто белым.
Я определил это с помощью двух тестов:
Сначала я загрузил JPEG в качестве слоя поверх оригинала, установил режим смешивания верхнего слоя на «Разница», затем добавил корректирующий слой «Уровни» над ним, чтобы попытаться увеличить различия. Полученное изображение оставалось черным, что означает «без разницы».
Во-вторых, когда я не смог увидеть ожидаемые различия, я уронил корректирующий слой и вернул слой JPEG в режим обычного наложения, взял инструмент пипетки и посмотрел по всему изображению пиксель, который не отображался как RGB (255,255,255 ) на информационной панели. Я так и не нашел. Я ожидал увидеть, как цифры будут немного мерцать, пока я чистил изображение, но они оставались неизменными.
Я могу только заключить, что это вырожденный случай алгоритма кодирования: чистые белые блоки остаются белыми через дискретное косинусное преобразование .
Интересно, что это не происходит с чистыми черными блоками. По крайней мере, в реализации Photoshop они превращаются в RGB (1,1,1) при декодировании, а не в RGB (0,0,0).
В итоге, вам не нужно беспокоиться о разбрызганных точках в этой области границы при печати изображения, полученного с использованием вышеуказанной техники.
jpegtran
является программой командной строки, но есть также программа Windows с графическим интерфейсом, основанная на том же самом коде jpegcrop
.
Увы, этот плагин предназначен только для Windows.
jpegtran
функция обрезки может также использоваться для расширения. (Однако не уверен, какого цвета будут вытянутые границы.)jpegtran
можно также увеличить изображение, но оно всегда дополнено жестко закодированным средним серым, RGB (128,128,128). Он делает это просто потому, что это единственный простой вариант, поскольку в пространстве коэффициентов DCT это можно сделать с помощью простогоbzero()
вызова. Я попробовал дикий взлом изменить это , что не работает, но должно дать вам ощущение уродства. вскидывает руки в отчаянииВажно помнить, что при сохранении фотографии в формате сжатия с потерями вы теряете качество . До тех пор, пока вы сохраняете фотографию в формате без потерь (PSD, TIFF и т. Д.) После добавления границы, вы не потеряете больше данных, чем уже потеряли, сохраняя фотографию в виде JPEG в первую очередь.
источник
Это не совсем без потерь, но вы можете быть довольно близко, используя GIMP (или другой редактор с похожей функцией) и следующие два трюка:
Во-первых, убедитесь, что добавляемая граница кратна 8 пикселям (и, предпочтительно, кратна 16 пикселям).
Это важно, потому что алгоритм сжатия JPEG разбивает изображение на блоки 8 × 8 пикселей *, начиная с верхнего левого угла, и применяет алгоритм сжатия с потерями независимо к каждому блоку. Таким образом, по крайней мере, в принципе, вы можете без потерь дополнить изображение JPEG, добавив полные блоки 8 × 8 пикселей вокруг существующих. Однако, если вы попытаетесь добавить рамку шириной не в целое число блоков, блоки в дополненном изображении не будут совпадать с блоками в оригинале, и некоторые потери сжатия будут неизбежны.
*) На самом деле, большинство изображений JPEG используют подвыборку цветности , что означает, что только часть изображения в градациях серого фактически сжимается в 8 × 8 блоков, тогда как каналы цветности уменьшаются на 50% перед сжатием, что делает их эффективный размер блока 16 ×. 16 пикселей. Таким образом, для достижения наилучших результатов ширина вашей границы должна быть кратна 16 пикселям. Тем не менее, обычно вы можете обойтись границей в 8 (или 24, 40 и т. Д.) Пикселей, так как небольшая потеря сжатия в цветности не очень заметна.
Вторая часть хитрости заключается в том, чтобы при сохранении окончательного изображения установить флажок «Использовать параметры качества из исходного изображения» в диалоговом окне « Экспорт изображения в JPEG» (в разделе «Дополнительные параметры»). Делайте это, даже если кажется, что это приведет к более низкому качеству, чем вы обычно используете!
Этот параметр заставляет GIMP повторно использовать те же самые параметры сжатия, которые использовались для исходного изображения, что обычно устраняет около 99% потерь на сжатие, при условии, что вы не редактировали изображение слишком сильно, и, в частности, что блоки в новое изображение по-прежнему совпадает с оригиналом. (Иногда все еще будут некоторые потери из-за ошибок округления, но гораздо меньше, чем было бы в противном случае.)
В качестве быстрой демонстрации я взял это тестовое изображение JPEG от Wikimedia Commons , первоначально сохраненного с довольно низким качеством, равным 50, и добавил к нему причудливую (вроде) черно-белую рамку размером 8px, используя метод, описанный выше:
Вот разница между исходным (15,1 кБ) и отредактированным изображением (16,7 кБ), показанным с использованием режима слоя GIMP «Извлечение зерна»:
Вы можете увидеть некоторые очень незначительные ошибки цветности, вызванные тем, что ширина границы не кратна 16, и (если вы посмотрите внимательно) несколько блоков, в которых также были незначительные потери в канале яркости из-за округления. Тем не менее, визуально, оригинал и дополненное изображение практически неразличимы, даже при 2-кратном увеличении и попеременном переключении между ними.
В частности, сопоставьте это с результатом повышения качества JPEG с 50 до 60 перед сохранением дополненного изображения, что дает следующее изображение размером 17,6 кБ:
При большом увеличении вы определенно можете увидеть, что отредактированное изображение в некоторых местах заметно размытее, чем оригинал, и разница с экстрактом зерна подтверждает это:
источник
Извините, если это не совсем то, что вы хотели, но ...
Похоже, что вы добавляете белую рамку для облегчения позиционирования изображения при печати. Почему бы не сосредоточиться на изучении интерфейсов печати должным образом и избегать таких хитрых хаков? Другая проблема, которая возникает, заключается в том, что вы позволяете программе печати изменять размер изображения 4680x3120 в соответствии с правильным разрешением / разрешением. Это может иметь более серьезный эффект, чем повторное сохранение JPEG.
источник
Предыдущие ответы очень хорошие.
Я просто добавлю некоторые «психологические аспекты» формата jpg.
Если JPG хорошо подготовлен, он теряет только около 0,5% информации. Это в подавляющем большинстве случаев то, что человеческий глаз не может видеть. Вам нужна программа, чтобы провести некоторый анализ и увидеть различия (как анализ, который только что сделал Ильмари).
«Хорошее качество» - это процесс, а не только способ, которым формат файла сохраняет изображение. Да, вы повторно сжали файл с помощью jpg, потому что он вам действительно нужен. Если он находится в контролируемой ситуации, это нормально.
Вы действительно нуждаетесь, это означает, что вы не можете использовать другой формат без потерь, у вас очень специфические потребности в хранилище или программном обеспечении, или очень жесткий рабочий процесс.
Если вы действительно обеспокоены качеством, возможно, вы не будете использовать Paint. В формате JPG есть некоторые конфигурации, которые вы вообще не можете контролировать в Paint.
Вот мой список бесплатных программ, где вы действительно можете управлять сжатием JPG, и вариант, который вам нужно выбрать. (Все они в диалоговом окне сохранения JPG)
Irfanview - Включить отключение цветовой подвыборки.
FastStone Image Viewer - Цветовая подвыборка: Нет.
Gimp - субсэмплинг 4: 4: 4
Вывод. Не используйте Paint.
Одно я еще не проверил. Если все эти программы поддерживают встроенный цветовой профиль. Я отредактирую свой пост позже.
источник
IrfanView хорошо работает для меня наборов изображений. Вот некоторые практические заметки
Вот моя хранимая процедура для вставки границы - Процедура Infran для добавления границы
источник