Як я можу додати рамку до фотографії JPEG, не впливаючи на якість?


24

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

Ясна річ, я нічого не змінюю і не знімаю з фотографії, просто щось додаю. Тому в принципі ця процедура може бути без втрат. Однак якщо я використовував Paint для додавання цієї межі, процес збереження Paint знову стисне фотографію у форматі JPEG, тим самим втрачаючи інформацію та якість.

Чи є спосіб (якась більш професійна програма) додати щось до фотографії JPEG, наприклад, облямівку, не впливаючи на оригінальну частину фотографії, не знижуючи її якості?

Відповіді:


35

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

JPEG працює, розбиваючи ваше зображення на блоки, що називаються мінімальними блоками кодування (MCU), як правило, 16 × 16, і стискаючи їх окремо. Це ви можете побачити на зображеннях, коли ви стискаєте рівень стиснення дуже високо. При більш розумних рівнях стиснення блоки зливаються так гладко, що ви ніколи не бачите меж.

Ми можемо скористатися цим фактом, щоб без втрат додати до образу просту білу облямівку. Нам просто потрібно створити порожній масив білих блоків, рівний розміру вихідного зображення, а потім опустити оригінальні блоки JPEG MCU в середину.¹

У цієї техніки є і зворотний бік: вона працює лише тоді, коли розміри вхідного та вихідного зображення одночасно є кратними розміру MCU. Якщо це не так, нам потрібно повторно стиснути деякі блоки на межі між білою облямівкою та краями вихідного зображення. Цю різницю у виході ви не побачите, якщо тримаєтесь подалі від надмірно високих рівнів стиснення JPEG, тому це все ще ефективно без втрат.

Мені не відома жодна програма, яка займається лише цим. Найближче, що мені відомо, - це те, що робить зворотну операцію: jpegtran має функцію обрізання, яка без втрат відрізає частини країв зображення. середина недоторканою.

Найпростіше готове рішення, про яке я знаю, - це кращий плагін JPEG Lossless Resave для Photoshop. Він використовує методи, засновані на ідеях, наведених вище, для копіювання MCU з оригінального зображення, де це можливо, щоб уникнути повторного створення їх із нестисненої версії, як це робить Photoshop.³


Відступи:

  1. Ви можете подумати, що отримана межа буде не зовсім білою , оскільки втрата JPEG створить певну різницю кольорів у виході. Я провів тестування, і, принаймні, у Photoshop, чисто біле зображення, збережене за допомогою JPEG рівня 10 збереження для веб-сайту (тобто "низької" якості), призводить до декодированого зображення, яке все ще є чисто білим.

    Я визначив це за допомогою двох тестів:

    Спочатку я завантажив JPEG як шар поверх оригіналу, встановив режим змішування верхнього шару на Difference, потім додав шар коригування рівнів над ним, щоб спробувати збільшити відмінності. Отримане зображення залишилося чорним, що свідчить про "відсутність різниці".

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

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

    Цікаво, що цього не відбувається з чистими чорними блоками. Принаймні з реалізацією Photoshop вони перетворюються на RGB (1,1,1) при розшифровці, а не на RGB (0,0,0).

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

  2. jpegtranце програма командного рядка, але існує також програма Windows GUI на основі того ж коду, що називається jpegcrop.

  3. На жаль, цей плагін доступний лише для Windows.


1
Я використовував програму під назвою JPEG Wizard, яка надала таку функціональність. Він також мав дуже приємну можливість застосовувати різні коефіцієнти стиснення до різних частин JPEG. Таким чином, можна використовувати високоякісні налаштування для голови та рук людини, середню якість їх одягу та нижчу якість для фону, і, таким чином, виходить менший файл, але краща загальна якість, ніж якби ви використовували середню якість для всього.
supercat

1
У мене не було можливості спробувати це, але ця публікація в блозі говорить про те, що jpegtranфункція врожаю насправді також може бути використана для розширення. (Не впевнений, якого кольору закінчуються розширені межі.)
mattdm

4
@mattdm: Так, jpegtranтакож можна розширити зображення, але воно завжди прокладається з жорстко зашифрованим середнім сірим кольором, RGB (128,128,128). Це робиться просто тому, що це єдиний простий варіант, оскільки в просторі коефіцієнтів DCT ви можете це зробити за допомогою простого bzero()дзвінка. Я спробував дику хаку змінити це , що не спрацьовує, але повинно дати вам відчуття потворності. розчаровує руки
Воррен Янг

@WarrenYoung: Щоб змінити колір блоків, слід, мабуть, змінити лише перший коефіцієнт (DC), а інші залишити в нулі. Звичайно, коефіцієнти стислі, так що ... так чи інакше, це слід зробити, але я згоден, що це не так банально, як може здатися.
Ільмарі Каронен

2
Що стосується вашого останнього пункту - найбільша економія отримується від викидання високочастотної інформації. Виграш від викидання точності на колір суцільного блоку пікселів не міг перевищувати байт-два, тому це ніколи або майже ніколи не робиться. Якщо є якісь втрати інформації, вона перетворюється на перетворення YUV <-> RGB кольорів.
варення

20

Тут слід пам’ятати, що ви втрачаєте якість, зберігаючи фотографію у форматі стиснення збитків. Якщо ви збережете фотографію у форматі без втрат (PSD, TIFF тощо) після додавання рамки, ви не втратите більше даних, ніж ви вже втратили, зберігаючи фотографію в першу чергу як JPEG.


1
Спасибі. І це справедливо навіть тоді, коли ви використовуєте «хитру» програму типу Paint, коли зберігаєте її, наприклад, у TIFF?
LBogaardt

4
Принаймні згідно з моїм швидким тестом, Paint використовує алгоритм стиснення LZW без втрат при збереженні TIFF, щоб це виглядало нормально.
Філіп Кендалл

5
Майте на увазі, що це, ймовірно, значно збільшить розмір зображення ...
BlueRaja - Danny Pflughoeft

2
фарба також підтримує 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 може конвертувати зображення в та з прогресивних втрат без втрат.
Damian Yerrick

@tepples: Ти маєш рацію; Я вилучив цей абзац. Чомусь у мене було враження, що перемикання прогресивного режиму призведе до того, що налаштування якості не збігаються, але, здається, швидкий тест підтвердив, що я помилявся в цьому.
Ільмарі Каронен

1
@thomasrutter: Я не можу оскаржити коментар, тому я просто вкажу вам на оригінальний пост на форумі, що описує функцію , і зокрема, цитата: " Якщо ви внесли лише кілька змін у зображення, то повторіть- використання одних і тих же таблиць квантування дасть вам майже однакову якість, а розмір файлу - це вихідне зображення. Це зведе до мінімуму втрати, спричинені кроком квантування, порівняно з тим, що відбудеться, якщо ви використовували різні таблиці квантування. "
Ілмарі Каронен,

1
Тільки для порівняння, ось ще один приклад у відповіді на інше запитання. Моє розуміння в теорії погоджується з Ільмарі, але, принаймні, на моєму прикладі, здається, що практика набагато більше того, що говорить Томас - принаймні, коли починається із сильно деградованого образу. (Я думаю, що надгробний камінь є поганим прикладом для цієї мети, оскільки втрата деталей на камені менш очевидна, ніж вони є на шкірі людини.)
mattdm

1
@mattdm: це, здається, залежить від програмного забезпечення; Я спробував відтворити ваші результати з цієї відповіді в GIMP, і, здається, GIMP (як мінімум, v2.8.10) є трохи кращим для збереження якості JPEG, ніж ImageMagick (будь-яку версію ви протестували). У вашому першому зображенні, збереженому один раз на q75, розмір PSNR становить 34,0298, тоді як на одному, збереженому двічі на q75, один із 32,8169 (а в 8 разів, що вновь збережений, має PSNR 32,6459). Для порівняння, збереження одного і того ж вихідного зображення в GIMP на q75 дає PSNR 36,4560; відкриття та відновлення його однакової якості знижує лише незначно, до 36,3295.
Ільмарі Каронен

3

Вибачте, якщо це не саме те, що ви хотіли, але ...

Це виглядає як додавання білої рамки як допоміжного засобу для розміщення зображення під час друку. Чому б не зосередитись на належному вивченні інтерфейсів друку та не уникнути подібних зловживань? Інша проблема, яка виникає, це те, що ви дозволяєте програмі друку змінити розмір вашого зображення 4680x3120, щоб відповідати правильній DPI / роздільній здатності. Це може мати більш серйозний ефект, ніж повторне збереження jpeg.


Обидва дійсні бали, дякую. Однак я завантажив свою фотографію в один із цих інтернет-магазинів, тому я не маю контролю над власним принтером.
LBogaardt

1

Попередні відповіді дуже хороші.

Я просто додам деякі "психологічні аспекти" формату jpg.

Якщо jpg добре підготовлений, він втрачає лише близько 0,5% інформації. Це в переважній більшості випадків те, чого людське око не може бачити. Вам потрібна програма, щоб зробити якийсь аналіз і побачити відмінності (як, наприклад, аналіз Ілмарі).

"Гарна якість" - це процес, а не лише спосіб збереження зображення у форматі файлу. Так, ви знову стиснули файл з jpg, тому що він вам справді потрібен. Якщо це в контрольованій ситуації, це нормально робити.

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

Якщо ви дійсно стурбовані якістю, напевно, ви б не використовували Paint. Формат JPG має деякі конфігурації, якими ви взагалі не можете керувати в Paint.

Ось мій список безкоштовних програм, де ви дійсно можете керувати стисненням jpg, і варіант, який потрібно вибрати. (Усі вони в діалоговому вікні збереження jpg)

Irfanview - Увімкніть Вимкнути підсистему кольорового кольору.

Швидкий перегляд зображень FastStone - Підсистема кольорів: немає.

Gimp - підгрупування 4: 4: 4

Висновок. Не використовуйте фарбу.

Одне я ще не перевірив. Якщо всі ці програми підтримують вбудований кольоровий профіль. Пізніше я відредагую свій пост.


Хтось проголосував -1 за цю відповідь. Зазвичай мені все одно, бо я знаю, що можу сказати щось німе. У цьому конкретному випадку, яка частина відповіді неправильна?
Рафаель

Я не голосував (ні вгору, ні вниз), але ви, можливо, захочете попрацювати над своїм написанням та граматикою, щоб створити краще перше враження (а також, чесно кажучи, щоб полегшити читання вашої відповіді). Також на це запитання вже є кілька відповідей (а моя, особливо, вийшла досить довгою); в якийсь момент деякі люди можуть почати зволікати (або, принаймні, не оскаржувати) відповіді, які чітко не додають чогось нового до існуючих. Також спробуйте структурувати свою відповідь так, щоб важливі біти виділялися з першого погляду; у цьому випадку єдина частина, яку ви виділили жирним шрифтом, - це неважлива виноска.
Ільмарі Каронен

Дякую за Ваш коментар Ilmari. Я намагаюся думати англійською мовою, оскільки це не моя рідна мова. Я буду шукати орфографічний інструмент. Я не впевнений, чи є граматика. - У другій частині коментаря я розумію, що логіка StackExchange полягає в тому, щоб відповісти на питання самостійно, оскільки потік відповідей не фіксований, оскільки вони можуть змінювати порядок чи редагувати. Я погляну на це. (Я видалив жирний текст) Ще раз дякую. : o)
Рафаель

1
"він втрачає лише близько 0,5% інформації" [потрібна цитата] :)
Warren Young

Привіт Уоррен, ось це: otake.com.mx/Apuntes/PruebasDeCompresion2/… Це на іспанській мові , будь ласка, використовуйте google translate зараз, і мені потрібно оновити його. Насправді це менше 0,392% :)
Рафаель

0

IrfanView мені добре підходить для наборів зображень. Ось декілька рекомендацій

Ось моя збережена процедура введення межі - процедура Infran для додавання рамки

  1. Клацніть правою кнопкою миші зображення, "Відкрити" -> "InfranView"
  2. Натисніть "b"
  3. Поставте прапорець "Використовувати розширені параметри" у верхньому лівому куті, натисніть "Додатково"
  4. Поставте прапорець "Розмір полотна", натисніть "Налаштування"
  5. Введіть кожну ширину кордону (зліва, справа, вгору, знизу)
  6. Натисніть "ОК"
  7. Виберіть "Перезаписати наявні файли"
  8. Натисніть "ОК"
  9. Введіть вихідний каталог "Вихідний каталог для файлів результатів:"
  10. Перейдіть до та двічі клацніть зображення, щоб додати межу до верхнього списку. Це додає його до списку "вхідні файли:" у нижньому списку
  11. Натисніть "Почати пакет"

1
Чи можете ви пояснити, що особливого у цьому методі, щоб він відповідав вимогам плаката не знижувати якість зображення? При першому читанні це, здавалося б, посилає JPEG через весь цикл декомпресії-перекомпресії, якого намагається уникнути плакат.
Філіп Кендалл

хммм, ви донесите цікавий момент щодо життєвого циклу зображення через перелічений тут процес, я не думав до цього. Ви можете мати рацію, якщо ви хочете, щоб я видалив або змінив свою публікацію, то, будь ласка, дайте мені знати!
J-Dizzle
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.