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

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

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

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

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

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

3 ответа

Решение

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

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

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

Да, я написал неполную реализацию этого. Это состоит из

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

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

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

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

Не возитесь с этим вокруг себя, вопрос обработки изображений является сложным из-за всех процессов сжатия и работы с BMP на диске, учитывая, что размеры вашего изображения (около 100 * 30 МБ = 3 ГБ), вероятно, не оптимальны и не быстры.

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

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

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

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