Можно ли повернуть сжатое изображение JPEG без потери качества?

JPEG — это схема сжатия с потерями, поэтому декомпрессия-манипулирование-повторное сжатие обычно снижает качество изображения на каждом этапе. Можно ли повернуть изображение JPEG без дальнейших потерь? Из того немногого, что я знаю об алгоритме JPEG, наивно кажется возможным избежать дальнейших потерь, приложив немного усилий. Какие распространенные программы для работы с изображениями (например, GIMP, Paint Shop Pro, Windows Photo Gallery) и графические библиотеки приводят к потере качества при повороте, а какие нет?


person Mat    schedule 12.02.2009    source источник


Ответы (10)


Да, это возможно для определенных случаев: повороты на 90 градусов и перевороты изображений. Сердце алгоритма JPEG — часть с потерями — включает в себя разбиение изображения на блоки 8x8 пикселей, выполнение дискретное косинусное преобразование блока и последующее квантование результата. Кроме того, есть некоторое преобразование цветового пространства и сжатие блоков без потерь.

Вращение или переворачивание блока 8x8 даст DCT с теми же основными коэффициентами, но, возможно, транспонированными и/или с некоторыми изменениями знака в зависимости от преобразования. Таким образом, основные шаги для поворота или отражения изображения без потерь включают:

  1. Распаковать и извлечь блоки
  2. Транспонировать и/или поменять знак коэффициентов DCT для каждого блока
  3. Перетасуйте блоки в их новом порядке (иначе блоки 8x8 будут повернуты, но останутся на старом месте)
  4. Повторно сжимайте все это с помощью шагов сжатия без потерь.
person Boojum    schedule 12.02.2009
comment
Есть ли java-библиотека, которая делает это? - person android developer; 05.02.2014
comment
Так что просто для ясности, что (повороты на 90 ° + перевороты) на изображениях с размерами, кратными 8, а не повороты на 90 ° + (перевороты на изображениях с размерами, кратными 8)? - person Mark Fisher; 30.03.2018
comment
@MarkFisher - Да, первое. Если подумать, изображение должно быть дополнено (например, dsp.stackexchange.com/a/35343), если необходимо, чтобы он имел полные блоки 8x8 для DCT. Так что я ошибся в том, что размеры должны быть кратны 8. - person Boojum; 03.04.2018
comment
Привет @Boojum, не могли бы вы посмотреть этот вопрос, я думаю, ваш ввод будет полезен для поворота изображения JPEG на месте. - person Aasim; 12.10.2020

Есть программа jpegtran.

jpegtran — утилита для транскодирования без потерь между различными форматами JPEG.

Чтобы повернуть изображение без потерь, вы можете сделать следующее:

$ jpegtran -rotate 180 -perfect -outfile rotated.jpg origin.jpg

И Вот список приложений, обеспечивающих функцию поворота JPEG без потерь на основе кода IJG

person kcwu    schedule 15.05.2009
comment
Примечание: соответствующий пакет называется libjpeg-turbo в ArchLinux. - person VasiliNovikov; 19.02.2017
comment
ВНИМАНИЕ: Я также обнаружил, что jpegtran фактически может терять качество. Наверное, так бывает с jpeg, размер которого не делится на 16. Приветствуются комментарии знающих людей. - person VasiliNovikov; 27.02.2017
comment
@VasiliNovikov На странице руководства есть подробности. Я не использовал операцию поворота, но знаю, что для операции обрезки она будет без потерь только в том случае, если вы выберете границы обрезки вдоль границ блока сжатия. Возможно, для поворота без потерь вам сначала нужно будет обрезать частичные блоки вдоль границ, а затем повернуть результат. - person Nobody; 05.12.2020
comment
@Nobody клавиша -perfect либо делает операцию успешной и дает вращение без потерь, либо вообще не производит никакого вывода и терпит неудачу. - person VasiliNovikov; 05.12.2020

Абсолютно - просто измените значение ориентации в данных EXIF. Подавляющее большинство программ обработки изображений будут учитывать этот параметр и показывать изображение «повернутым».

Также возможно "вручную" (например, программно) повернуть изображение без потерь, если выполняются определенные критерии - поворот должен быть 90/180 градусов, а ширина/высота должны быть кратны размеру блока. Вы также можете перевернуть / отразить его. Я не знаю, достаточно ли умны программы обработки изображений, чтобы использовать эту операцию в особых случаях. Я бы предположил, что нет.

person Andrew Grant    schedule 12.02.2009
comment
Вы можете вручную выполнить преобразование 90-180-270 без потерь с помощью jpeg. - person xpda; 27.01.2010
comment
изменение Exif изображения никак не повлияет на сами данные, а некоторые средства просмотра изображений плохо обрабатывают его. плюс, немного сложнее играть, если вы хотите изменить изображение, так как вам нужно учитывать ориентацию... - person android developer; 05.02.2014
comment
Qt QImage/QPixmap не принимает во внимание поле ориентации exif. - person Gabriel; 20.01.2020
comment
При загрузке на онлайн-форумы или большинство веб-сайтов удаляйте данные EXIF ​​с фотографии, поскольку это может привести к утечке конфиденциальных данных для отслеживания человека (например, координаты). Я думаю, что ни один браузер не поддерживает чтение изображения по данным EXIF. - person bsound; 07.05.2020

Из часто задаваемых вопросов по JPEG:

«Существует несколько специальных операций, которые можно выполнить с файлом JPEG без его распаковки и, таким образом, без потери поколения, которую вы обычно получаете при загрузке и повторном сохранении изображения в обычном редакторе изображений. В частности, это можно выполнять повороты и перевороты на 90 градусов без потерь, если размеры изображения кратны размеру блока файла (обычно 16 x 16, 16 x 8 или 8 x 8 пикселей для цветных файлов JPEG).
...

Но вам нужно специальное программное обеспечение; вращение изображения в обычном графическом редакторе не будет без потерь».

person ISW    schedule 12.02.2009

Не эксперт по jpg, но кажется, что ответ будет Да для поворотов на 90, 180, 270 градусов. (может даже на 360! :))

person Assaf Lavie    schedule 12.02.2009
comment
360 выполнимо, но 720 требует больше навыков - person Javier; 13.02.2009
comment
Я вас всех побил: я могу повернуть JPEG на 0 градусов, используя только свой разум. - person MusiGenesis; 16.08.2009

Да, это возможно.
Быстрый поиск в Google дал список программ, которые делают это

person shoosh    schedule 12.02.2009
comment
Вы знаете какую-нибудь библиотеку, которая это делает? - person android developer; 05.02.2014

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

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

person Ketan    schedule 12.02.2009

Если вы не повернете изображение на угол, кратный 90 градусам, ваше изображение должно будет выполнить некоторую интерполяцию, которая может снизить качество вашего изображения. Здесь поможет хороший алгоритм интерполяции.

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

Я предлагаю вам попробовать сжимать, манипулировать и повторно сжимать и лично убедиться, достаточно ли хорош результат. То, что достаточно хорошо, зависит от вашего заявления.

person Hannes Ovrén    schedule 12.02.2009
comment
Открытие и повторное сжатие, особенно многократные, определенно приведут к ухудшению качества. Это фундаментальная слабость сжатия без потерь. (Как вы предполагаете, достаточно ли это хуже, чтобы заботиться, безусловно, субъективно.) - person John Melville; 21.02.2011

Согласно прекрасной статье Шона МакХью Understanding Digital Image Interpolation:

Интерполяция также происходит каждый раз, когда вы поворачиваете или искажаете изображение. (...) Поворот на 90° выполняется без потерь, потому что ни один пиксель не нужно перемещать на границу между двумя пикселями (и, следовательно, разделять).

и в конце концов заканчивается

по возможности избегайте поворота фотографий; если этого требует невыровненная фотография, поверните не более одного раза.

person mloskot    schedule 21.01.2010

Если это может помочь:

Пытаясь добиться большего успеха, чем встроенное средство просмотра изображений Microsoft (Windows 7) и его параметры поворота правой кнопкой мыши, я попробовал несколько приложений по следующей ссылке: http://jpegclub.org/losslessapps.html

Например, я попробовал FastStone Image Viewer, XnView, Photosurfer, JPEG Lossless Rotator, ExifPro Image Viewer.

НИ ОДНА из них не дает изображения большего размера, чем базовая программа просмотра изображений Windows 7 после простого поворота на 90°. По общему признанию, это ограничено, чтобы закончить так быстро, но я до сих пор не нашел настоящего приложения для вращения .jpeg без потерь на данный момент, и в любом случае не лучше, чем встроенное в Windows.

person user3094822    schedule 09.04.2014