Чи можемо ми змінити розмір JPEG-зображення за допомогою декодування та повторного кодування?


12

Я хочу перетворити JPEG-зображення 640x480 у формат 320x240. Я знаю, що це можна зробити, розшифрувавши зображення JPEG в необроблений YCbCr, масштабуйте його і перекодуйте в JPEG. Але чи можливо за допомогою кодування JPEG безпосередньо масштабувати зображення за допомогою декодування?

Відповіді:


14

Ви можете, але тільки якщо ваш переглядач JPEG підтримує розширення JPEG SmartScale . jpegtran може зробити це для розмірів N / 8, при N = 1..16. В основному розмір блоку DCT змінюється з 8x8 на щось інше під час рекомпресії (наприклад, 4x4), що ефективно масштабує зображення.

Примітка: SmartScale був представлений у версії 8 бібліотеки libjpeg, але його широко не підтримують глядачі.

Документ, що детально описує зміни, можна знайти тут: Еволюція JPEG .

EDIT: Схоже, більшість глядачів фактично не можуть відображати ці зображення, оскільки вони засновані на libjpeg-turbo. І libjpeg-turbo вирішив не застосовувати цю функцію . Насправді я спробував досить багато програм (на Ubuntu 14.04 та Windows 8), і жодна не змогла відобразити зменшене зображення, створене за допомогою jpegtrans. Навіть Photoshop, IrfanView і GIMP не вдалося.

EDIT 2: Насправді Ubuntu та Fedora навіть не постачають бібліотеку libjpeg8, а повністю замінюють її версією libjpeg-turbo. Тож жодна з програм не зможе читати файли JPEG SmartScale, за винятком кількох двійкових файлів, які статично пов'язані з оригінальною бібліотекою libjpeg8.


Чи є кодек, який створює зображення, яке зростає, лише додаючи до нього додаткові дані?
Necktwi

як щодо прогресивного jpeg? Хіба це не робить саме те, що я прошу?
Necktwi

Ні, це робить щось дещо інше, підвищуючи якість зображення (від низької до повної), але роздільна здатність завжди незмінна ( довідкова ). Однак є ще одне розширення JPEG під назвою "ієрархічний режим", яке кодує різні дозволи ( див. Також тут ). Але знову ж таки, libjpeg-turbo не підтримує його (дивіться тут , шукайте "прогресивний" у тексті).
jmiserez

1
І щоб відповісти на перший коментар, звичайно, є такі кодеки. Тільки не JPG. Те, що ви шукаєте, називається пірамідою зображень або багатомасштабним поданням. Наприклад, JPEG2000 використовує вейвлет-перетворення, яке створює вейвлет-піраміду. Існують і інші піраміди, такі як піраміди Гаусса або Лаплація. Цей шістдесят дає хороший огляд того, як все працює, тоді як JPEG2000 обговорюється тут і тут .
jmiserez

Дякуємо за інформацію про нові формати JPEG. Я не сподіваюсь, що багато джерельних зображень (камери, сканери тощо) ще не використовуватимуть їх.
AFH

3

Коротка відповідь - ні. JPEG-зображення використовує стиснення, що означає, що кожен вихідний байт залежить від усіх інших. Якщо ви змінили кількість байтів зображення, то вам слід розпакувати та перекомпресувати.

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

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

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