Как создать большой файл изображения из множества плиток в 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.
Для получения дополнительной информации об обработке больших изображений прочитайте эту статью.