Я работаю над проектом, для которого мне нужно без потерь объединить тысячи изображений JPEG (здесь я не говорю о форматах Lossless JPEG/JPEG 2000/JPEG-LS).
Вышеупомянутые изображения имеют различные уровни цветовой подвыборки (1x1, 1x2, 2x1, 2x2), что приводит к различным размерам MCU (8x8, 8x16, 16x8, 16x16 px). Однако в любом данном наборе изображений, которые должны быть объединены, каждое изображение имеет идентичные характеристики.
Пока давайте предположим, что у меня есть только 2 изображения. Размер изображения 1 (I1) составляет 256x256 пикселей, а размер изображения 2 (I2) составляет 239x256 пикселей. Используется субсэмплинг 2x2, так что размер MCU составляет 16x16px. Таким образом, I2, очевидно, имеет частичные MCU на правом краю, поскольку его ширина не делится равномерно на 16. (Я читал, что так называемые «частичные» микроконтроллеры на самом деле содержат данные для полного микроконтроллера, но размеры изображения инструктируют средство визуализации отображать только соответствующие пиксели и игнорировать / скрывать дополнительные.)
В поисках инструментов, которые могли бы помочь мне в этом, я наткнулся на модифицированную версию JpegTran, которая содержит экспериментальную функцию без потерь обрезки (вырезать и вставить). Все другие приложения, с которыми я столкнулся, которые поддерживают редактирование JPEG без потерь, похоже, используют код IJG (JpegTran), так что это, казалось, логичный выбор. Кроме того, учитывая огромное количество изображений, я хотел что-то, что желательно запускать из командной строки, чтобы я мог автоматизировать процесс с помощью сценария.
К сожалению, хотя все остальное работало нормально, кажется, что JpegTran обрезает частичные MCU вместо того, чтобы сохранять их. Таким образом, в приведенном выше примере конечное объединенное изображение содержит все I1, но только 224x256px от I2. Почему 224? потому что 239 = 14x16+15, что означает, что есть 14 полных MCU по ширине и 1 частичный MCU (всего на 1 пиксель меньше, чем полные 16 пикселей). Последние 15px - это то, что становится пустым, приводя к изображению 495x256px с 15px пустых (серых) пикселей на правом краю. Смотрите изображения ниже (позор, который imgur повторно сжимает их):
(слева) + (право)
знак равно
Как вы можете ясно видеть, красная часть (15 пикселей) I2 была обрезана JpegTran. Если бы MCU имели ширину 8 пикселей, потерянная часть была бы самой правой 7 пикселей I2. Точно так же присоединение I3 (256x239px) * ниже * I1 приведет к потере 7 или 15px, в зависимости от высоты MCU, конечно:
(вверху) + (низ)
знак равно
Можно ли даже попытаться сделать то, что я пытаюсь сделать, или так называемое "без потерь" обрезка JPEG "n" допустима только для изображений без частичных микроконтроллеров? (Возможно, именно поэтому эта функция все еще находится в "экспериментальном состоянии" более десяти лет спустя после ее внедрения ...)
Пока я точно не знаю , что это невозможно, меня не интересуют предложения о присоединении с потерями. Исключение потери любого поколения - единственная причина, по которой я ломаю голову над этим, иначе я бы сделал это и вычистил давным-давно. Также меня не интересуют предложения, связанные с переключением форматов изображений. Я не контролирую источник изображений.
Если это можно сделать, то как? Пожалуйста, имейте в виду, что любые предлагаемые альтернативные приложения в идеале должны быть способны к автоматизации, учитывая требования, изложенные выше. (Но учитывая, что маловероятно, что я даже получу полезный ответ с учетом ограничений, я был бы рад любому предложению приложения, если оно действительно работает. Я всегда могу заглянуть в скрипт AutoIT/AHK или что-нибудь позже, чтобы автоматизировать его.)
Я понимаю, что конечное изображение нечетного размера может вызвать проблемы, поэтому я полностью готов принять любое решение, даже если оно приведет к пустым (предпочтительно черным) отступам пикселей вправо / вниз. Я имею в виду, что мне все равно, если I1 + I2 имеет размер 49 6 x256px (отступ 1px) или даже 512x256px (отступ 17px), если конечное изображение содержит все фактические данные изображения из обоих исходных изображений, и весь процесс без потерь. Очевидно, что чем меньше отступ (если есть), тем лучше, но на этом этапе подойдет любое решение.
Решение на основе Windows было бы идеальным, но решение на основе Linux было бы вполне приемлемым (предварительно скомпилированные двоичные файлы без внешних зависимостей, если это вообще возможно, вместо просто фрагментов кода). Кроме того, пожалуйста, бесплатное программное обеспечение, если только ничего, кроме платного программного обеспечения не добьется цели.