Как объединить изображения без загрузки их в оперативную память на Java - PullRequest
4 голосов
/ 06 октября 2011

У меня очень большое (около гигапикселя) изображение, которое я пытаюсь сгенерировать, и до сих пор я могу создавать изображения до 40 мегапикселей только в BufferedImage до того, как получу сообщение об ошибке памяти.Я хочу построить изображение по частям, а затем объединить части без загрузки изображений в память.Я мог бы также сделать это, записав каждую часть в файл, но ImageIO не поддерживает это.

Ответы [ 4 ]

1 голос
/ 06 октября 2011

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

. Также взгляните на эти вопросы, которые могут помочь вам с идеями.

  1. Как сохранить большое фрактальное изображение с минимально возможным объемом памяти
  2. Как создать файл большого изображения из множества плиток
  3. Добавление к файлу изображения

В основном вы хотите повернуть туда 2.
Удачи в вашем проекте;)

0 голосов
/ 19 января 2017

Если нет способа сделать это встроенным в Java (ради вас, я надеюсь, что это не так, и кто-то ответит на это так), то вам нужно будет реализовать алгоритм самостоятельно, как это прокомментировали другие, говоря:итак.

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

Некоторые алгоритмы, такие как jpg, могут быть невозможны для реализации с линейным потоком фрагментов файла таким образом.Как предположил @warren, bmp, вероятно, проще всего реализовать таким способом, поскольку этот формат файла имеет заголовок, состоящий из такого количества байтов, что он просто выводит данные RGBA прямо в двоичном формате (вместе с некоторыми отступами).Так что, если вы должны были загрузить свои подизображения, которые должны быть объединены, загружать их логически по 1 за раз (хотя вы могли бы на самом деле многопоточность этой вещи и загружать следующие данные одновременно, чтобы ускорить это, поскольку этот процесс будет выполнятьсядолгое время), читая следующую строку данных, сохраняя ее в свой двоичный выходной поток и т. д.

Возможно, вам даже придется загружать подизображения несколько раз.Например, представьте себе сохраняемое изображение, состоящее из 4 подизображений в сетке 2x2.Вам может понадобиться загрузить изображение 1, прочитать его первую строку данных, сохранить его в новый файл, выпустить изображение 1, загрузить изображение 2, прочитать его первую строку данных, сохранить, выпустить 2, загрузить 1, чтобы прочитать его вторую строкуданные и тд.Скорее всего, вам понадобится сделать это, если вы используете сжатый формат изображения для сохранения в.

Чтобы снова предложить bmp, поскольку bmp не сжимается, и вы можете просто сохранить данные в любом формате, который хотите(при условии, что файл был открыт способом, обеспечивающим произвольный доступ), вы можете пропустить файл, который вы сохраняете, чтобы полностью прочитать 1 фрагмент изображения и сохранить все его данные, прежде чем переходить к следующему.Это может обеспечить экономию времени выполнения, но может также обеспечить ужасные размеры сохраненных файлов.

И я мог бы продолжить.Вероятно, будет несколько ловушек, оптимизаций и т. Д.

Вместо сохранения 1 огромного файла, который является результатом объединения других файлов, что делать, если вы создали новый формат файла изображения, который был просто составлен изметаданные, позволяющие ссылаться на другие файлы таким образом, чтобы логически объединять их, фактически не создавая 1 массивный файл?Возможность выбора нового формата файла изображения зависит от вашего программного обеспечения;если вы ожидаете, что люди будут использовать эти изображения для использования в другом программном обеспечении, то это не сработает - по крайней мере, если вы не сможете получить новый формат файла изображения, который станет популярным и станет стандартным.

0 голосов
/ 15 декабря 2012

Я вижу два простых решения.Создайте собственный двоичный формат для вашего изображения.Для сохранения просто сгенерируйте одну деталь за раз, ищите () в соответствующем месте в файле, затем выгружайте ваши данные.Для загрузки ищите () нужное место в файле, затем загружайте свои данные.

Другое решение - самостоятельно изучить формат изображения.bmp несжатый, но единственный легкий для изучения.После изучения вышеперечисленные шаги работают довольно хорошо.

Не забудьте преобразовать ваше изображение в байтовый массив для удобства хранения.

0 голосов
/ 06 октября 2011

Не правильное решение, просто эскиз.

Распаковка фрагмента изображения не легка, когда изображение сжато. Вы можете распаковать изображение с помощью внешнего инструмента в некоторый тривиальный формат (xpm, несжатый tiff). Затем вы можете загрузить части этого изображения в виде байтовых массивов, поскольку формат очень прост, и создавать экземпляры Image из этих необработанных данных.

...