Я недавно скомпилировал libjpeg версии 9 и попытался запустить jpegtran.exe в командной строке с аргументами:
.\jpegtran.exe -rotate 180 -outfile test_output1.jpg testimg.jpg
testimg.jpg: test_output1.jpg:
Как вы можете видеть, оно поворачивает изображение, но оно обрезает его и неправильно соединяет. Файл use.txt, поставляемый с пакетом, не полностью обновлен, потому что мне пришлось использовать ключ -outfile вместо того, что он говорит:
jpegtran использует синтаксис командной строки, похожий на cjpeg или djpeg. На
Unix-подобные системы, вы говорите:
- jpegtran [переключатели] [входной файл]> выходной файл
В большинстве не-Unix систем вы говорите:
- jpegtran [switch] входной файл выходной файл
где оба входных и выходных файла являются JPEG
файлы.Чтобы указать кодированное представление JPEG, используемое в выходном файле,
jpegtran принимает подмножество переключателей, распознаваемых cjpeg:
- -Оптимизация Выполнение оптимизации параметров энтропийного кодирования.
- -Прогрессивный Создайте прогрессивный файл JPEG.
- -арифметика Используйте арифметическое кодирование.
- -restart N Излучать маркер перезапуска JPEG через каждые N MCU строк или через каждые N MCU блоков, если к номеру прикреплена буква «B».
- -файл сканов Используйте скрипт сканирования, указанный в указанном текстовом файле.
Смотрите предыдущее обсуждение cjpeg для более подробной информации об этих
переключатели. Если вы не укажете ни один из этих ключей, вы получите простой
выходной файл baseline-JPEG. Настройка качества и т. Д.
определяется входным файлом.Изображение может быть преобразовано без потерь, давая один из этих
переключатели:
- -Отразить по горизонтали Отразить изображение по горизонтали (влево-вправо).
- -Отразить по вертикали Зеркальное отображение по вертикали (сверху вниз).
- -повернуть на 90 Поворот изображения на 90 градусов по часовой стрелке.
- -повернуть на 180 Повернуть изображение на 180 градусов.
- -повернуть 270 Повернуть изображение на 270 градусов по часовой стрелке (или на 90 градусов по часовой стрелке).
- -транспонировать Транспонировать изображение (по оси UL-to-LR).
- -поперечная поперечная транспонирование (по оси UR-to-LL).
Как ни странно (а может и нет), если я выполню .\jpegtran.exe -rotate 180 -outfile test_output2.jpg test_output1.jpg
Я получаю исходное изображение без каких-либо проблем с отсечкой. Он переворачивает обрезанные части, но не выравнивает их с остальной частью изображения.
test_output2.jpg:
Я получаю тот же результат, выполняя jpegtran.exe -rotate 90
дважды.
Кроме того, я попробовал его на более крупном файле .jpg, что привело к той же самой проблеме, но размер файла был на 18 КБ меньше для вывода. Я думаю, что проблема связана с этим.
Редактировать — я также нашел эту рекламу, которая, кажется, описывает проблему:
Поведение jpegtran по умолчанию при преобразовании изображения нечетного размера
разработан, чтобы сохранить точную обратимость и математическую последовательность
набора преобразований. Как уже говорилось, транспонирование может перевернуть
Вся область изображения. Горизонтальное зеркальное отражение оставляет любую частичную iMCU
столбец на правом краю нетронутым, но может перевернуть все строки
изображение. Точно так же вертикальное зеркальное отображение оставляет любой частичный ряд iMCU
на нижнем краю нетронутым, но может перевернуть все столбцы.
другие преобразования могут быть построены как последовательности транспонирования и отражения
операции; для согласованности их действия на краевые пиксели определены
быть таким же, как конечный результат соответствующего
последовательность транспонирования и флип.
Переключатель -trim работает, если вы можете так его назвать, и обрезает неорганизованные данные, но изображение становится меньше и данные теряются.
test_output5.jpg:
Добавление ключа -perfect, который предположительно останавливает выполнение вышеизложенного, приводит к следующему: transformation is not perfect
для вывода и без изображения.
Так нельзя ли без потерь вращать .jpg? Я мог бы сам рисовать и восстанавливать исходное изображение, просто перемещая линии краев на их правильные места. Есть ли способ сделать это в libjpeg?
Вращение без потерь работает со всеми блоками DCT, содержащимися в файле JPEG. Эти блоки всегда 8×8 или 16×16 пикселей (в зависимости от сжатия даунсамплинг Настройки). Файл содержит ширину и высоту, поэтому дополнительные пиксели могут быть выброшены при декодировании изображения, но нет возможности переместить обрезку от правого / нижнего края к левому / верхнему краю. Программное обеспечение делает все возможное с невозможной проблемой.
Как вы обнаружили, эта проблема заключается в том, чтобы сделать ширину и высоту равномерно делимой на 16. Вы обнаружите, что, например, изображения с камер будут иметь это свойство.
Других решений пока нет …