Можем ли мы изменить размер изображения JPEG без декодирования и перекодирования?


12

Я хочу преобразовать изображение JPEG размером 640x480 в 320x240. Я знаю, что это может быть сделано путем декодирования изображения JPEG в необработанный YCbCr, масштабирования и перекодирования в JPEG. Но возможно ли в кодировке JPEG напрямую масштабировать изображение без декодирования?

Ответы:


14

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

Примечание. SmartScale был представлен в 8-й версии библиотеки libjpeg, но он не получил широкой поддержки у зрителей.

Документ, подробно описывающий изменения, можно найти здесь: Evolution of JPEG .

РЕДАКТИРОВАТЬ: Кажется, что большинство зрителей не могут отображать эти изображения, так как они основаны на libjpeg-turbo. И libjpeg-turbo решила не реализовывать эту функцию . На самом деле, я пробовал довольно много программ (на Ubuntu 14.04 и Windows 8), и ни одна из них не смогла отобразить уменьшенное изображение, созданное с помощью jpegtrans. Даже Photoshop, IrfanView и GIMP не удалось.

РЕДАКТИРОВАТЬ 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.