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

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

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

решение1

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

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

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

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

ПРАВКА 2:Фактически, Ubuntu и Fedora даже не поставляют библиотеку libjpeg8, а полностью заменяют ее версией libjpeg-turbo. Поэтому ни одна из программ не сможет читать файлы JPEG SmartScale, за исключением нескольких двоичных файлов, которые статически связаны с оригинальной библиотекой libjpeg8.

решение2

Короткий ответ — нет. Изображение JPEG использует сжатие, что означает, что каждый выходной байт зависит от всех остальных. Если вы измените количество байтов изображения, то вам придется распаковать и сжать заново.

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

Если вы много работаете с изображениями, лучше всего работать в формате сжатия без потерь, например, PNG, конвертируя в JPEG только после завершения обработки изображений, конечно, при условии, что у вас есть дополнительное место на диске.

Связанный контент