Как создать большой файл изображения из множества плиток в java?


Моя программа производит 10 x 10 плиток изображения 3000x3000 пикселей, один за другим (в настоящее время сохраняются в 100 файлов с именем image_x_y.jpg)

Я хочу собрать эти 100 изображений в один большой образ, не загружая все в память. Моя цель-создать один большой файл изображения, размером 30 000 * 30 000 пикселей.

Я ищу способ сделать это Без использования JAI (который не может быть установлен из общедоступных репозиториев maven, я не понимаю, почему)

Есть ли способ сделать это с помощью pure java2D ? Или существует другая библиотека, способная справиться с этим ?

Моя первоначальная идея состояла в том, чтобы создать очень большой буферизованный образ из буфера данных, сохраненного в файл на диске. Но я не уверен, что это возможно. Кто-нибудь когда-нибудь делал это ?
4 7

4 ответа:

Я хочу собрать эти 100 изображений в один большой образ, не загружая все в память. Моя цель-создать один большой файл изображения, размером 30 000 * 30 000 пикселей.

Я считаю, что в JAI есть класс, который делает это. Какие бы проблемы ни возникали у вас с интеграцией JAI в ваш проект, я буду упорствовать в этом, а не сверну вашу собственную версию. В Java2D нет ничего подобного.

Моя первоначальная идея состояла в том, чтобы создать очень большой буферизованный образ, из буфера данных, сохраненного в файл на диске. Но я не уверен, что это возможно. Кто-нибудь когда-нибудь делал это ?

Да, я написал неполную реализацию этого. Он состоит из
  • a DataBuffer, который поддерживается ByteBuffer вместо массива (если буфер прямой, он может быть сопоставлен с файлом.)
  • A WritableRaster аналогично стандартным растрам, но с использованием моей реализации DataBuffer (стандартные растры в JDK обманывают, удерживая ссылку на вспомогательного массива. В случае прямого ByteBuffer массива не существует, поэтому, к сожалению, вы должны повторно реализовать большинство методов Raster.)

Я не рекомендую расширять SampleModel, потому что ваш класс не будет работать с растрами JDK (различные методы в Java2D, включая заводские методы Raster, переключаются на Тип SampleModel, предполагая, что это один из стандартных. Плохой дизайн ИМХО, но не так много вы можете сделать с этим, кроме как следовать той же схеме.)

Я не знаю, возможно ли это без загрузки всего в память. Вы можете сбросить все ваши изображения в несжатый bmp, а затем использовать какой-либо внешний инструмент для преобразования его в jpg.

Если у вас возникли проблемы с использованием ресурса из общедоступного репозитория maven, вы можете использовать Nexus, прокси maven, и вручную добавить Jai jar туда (и добавить его в список репозиториев).

Преимущество выбора этого решения заключается в том, что у вас будет JAI и стандартный способ использования ресурсов, не связанных с maven (все библиотеки javax), в maven.

Не возитесь с этим вокруг себя, материя изображения сложна из-за всего сжатия участие и работа с BMPs на диске, учитывая ваши размеры изображения (около 100 * 30MB = 3GB), вероятно, не оптимальны и не быстры.

Решение BigBufferedImage. Он может загружать и хранить гораздо большие изображения, чем лимит памяти. Хитрость заключается в том, что его буфер заменяется файловой реализацией DataBuffer. Он хранит декодированные необработанные данные изображения в файлах. Оперативная память не используется. Это может предотвратить исключение OutOfMemoryException.

Для получения дополнительной информации об обработке больших изображений прочитайте эту статью.