Объедините JPEG разных размеров с jpegtran

Я успешно использовал jpegtran для объединения JPEG одинакового размера (512x512), используя метод, описанный в этом ответе stackru: /questions/8715215/obrezka-bez-poter-vyirezat-i-vstavit-dlya-jpeg/8715222#8715222

Это плиточные JPEG из интернета, которые в сочетании создают 360 панораму. Как я уже сказал, изображения 512x512 отлично сочетаются с jpegtran; однако я понял, что некоторые из плиток, составляющих панораму, имеют размер 256x256 и должны быть удвоены по размеру в сочетании с другими плитками для формирования панорамы (в 2D-форме равноугольной проекции).

Проще говоря, мне нужно знать, сможет ли jpegtran без потерь объединить два JPEG разных размеров, например, могу ли я без потерь удвоить разрешение плитки 256x256, а затем объединить ее с другой плиткой 512x512.

Я знаю, что это можно сделать с помощью перекодирования, но я спрашиваю, можно ли это сделать абсолютно без потерь. Благодарю.

1 ответ

Не сейчас, нет. Нам понадобится следующее:

  1. Обрезка без потерь - долго поддерживается
  2. SmartScale — обратите внимание, что это не соответствует стандарту ITU JPEG, изменит размер макроблоков в пикселях и не будет работать со многими декодерами.
  3. Возможность изменения размера макроблока на полпути через файл. Я предполагаю, что SmartScale не поддерживает это, но поддерживают некоторые новые форматы сжатия изображений/видео.
  4. Вспомогательное программное обеспечение - в настоящее время недоступно. Я протестировал последнюю доступную на данный момент версию JPEG-9e, которая не может добавлять файлы JPEG с разными коэффициентами SmartScale/размерами макроблоков.

Вот что я придумал, учитывая, что jpegtran,иоперации не могут быть объединены:

      #start with two images
#512x512.jpg - 64x64 macroblocks
#256x256.jpg - 32x32 macroblocks

#uncrop 2x1x using libjpeg7+ to give us space for later.
#out.jpg resolution is 1024x512, 128x64 macroblocks
jpegtran -crop 1024x512+0+0 -outfile out.jpg 512x512.jpg

#upscale the 256px image to 512x512 using libjpeg8+'s SmartScale
#Note: Does not change image width/height in macroblocks!
#Note: Only changes width/height of macroblocks!
#upscale.jpg is 512x512 but still 32x32 macroblocks
jpegtran -scale 8/4 -outfile upscale.jpg 256x256.jpg

#drop in upscale.jpg on the right half of the output image.
jpegtran -drop +512+0 upscale.jpg -outfile out.jpg out.jpg

Однако последняя команда завершается с ошибкой: «Поддельный доступ к виртуальному массиву», что является строкой дляошибка, вызванная строкой 857 jpeg-9e/jmemmgr.c.

Это не удается, потому чтогде rows_in_array составляет 32 макроблока, а end_row достигает 33 макроблоков — первая строка макроблока отсутствует в

jpegtran ожидает, что изображение 512x512 пикселей будет состоять из макроблоков 64x64 с использованием размера макроблока целевого изображения, поэтому на полпутиу него заканчиваются исходные макроблоки, и он уходит за конец изображения. Если бы мы исправили libjpeg, чтобы использовать правильный размер макроблока, нам нужно было бы каким-то образом закодировать в файле, что размер макроблока изменился, но я не уверен, как это будет сделано.

Другие вопросы по тегам