Полагаю, вы уже решили эту проблему или как-то обошли ее, но .. Если кому-то еще понадобится решить аналогичную проблему:
Немного неясно, чего вы пытаетесь достичь здесь.Вы действительно хотите создать одно большое изображение или создать один файл, содержащий несколько изображений?
Несколько изображений в одном файле:
Ваш код добавляет несколько отдельных файлов JPEG в один файл.Формат JPEG (JFIF) не поддерживает это, и большинство программ, вероятно, увидят ваш файл как первый JPEG с множеством ненужных байтов, добавленных к нему в конце.PNG не позволяет хранить несколько изображений в одном файле AFAIK.Такой формат, как TIFF, позволяет использовать несколько изображений (даже позволяет сохранять их в виде потоков JPEG), поэтому, вероятно, и был вызван формат TIFF.
Однако в стандарте JPEG есть концепция, называемая Сокращенные потоки., это очень похоже на то, как JPEG обычно хранится в пирамидальном формате TIFF.ImageIO JPEGImageWriter
поддерживает эту функцию:
"Сокращенные потоки записываются с использованием методов последовательности ImageWriter. Метаданные потока используются для записи изображения только для таблиц в начале потока, итаблицы настраиваются для использования с использованием ImageWriter.prepareWriteSequence. Если метаданные потока не передаются в ImageWriter.prepareWriteSequence, то не записывается изображение только для таблиц. Если метаданные потока, не содержащие таблиц, не передаются в ImageWriter.prepareWriteSequence, то таблицызаписывается только изображение, содержащее стандартные таблицы без визуальных потерь. "
Я не уверен, как другие программы будут интерпретировать файлы такого типа, и согласно документам libjpeg он, вероятно, выигралдаже не работают:
"Хотя сокращенные потоки данных могут быть полезны в закрытой среде, их использование настоятельно не рекомендуется в любой ситуации, когда может потребоваться обмен данными с другими приложениями. Caveat designer."
Так .. Может или можетне подходит для вашего случая использования.
Составьте несколько изображений в одно большое изображение:
Если, с другой стороны, вы действительно хотите объединить несколько изображений в одно большоеimage (а затем сохраните его в виде отдельного JPEG), вы могли бы взглянуть на некоторый код , который я написал давно, чтобы разрешить работу с большими изображениями без использования кучи памяти.
Он использует буферизированные в памяти байтовые буферы и могут быть мучительно медленными, если у вас недостаточно памяти для хранения данных в ОЗУ.Кроме того, результирующее BufferedImage
всегда будет иметь значение TYPE_CUSTOM
, поэтому оно будет пропускать большинство потенциально аппаратного или собственного ускорения, которое вы обычно получаете, и некоторые операции могут не работать на нем.Однако, по крайней мере, вы не ограничены ни размером кучи, ни физической памятью.