Как создать большой файл изображения из множества плиток в java?
Моя программа производит 10 x 10 плиток изображения 3000x3000 пикселей, один за другим (в настоящее время сохраняются в 100 файлов с именем image_x_y.jpg
)
Я ищу способ сделать это Без использования JAI (который не может быть установлен из общедоступных репозиториев maven, я не понимаю, почему)
Есть ли способ сделать это с помощью pure java2D ? Или существует другая библиотека, способная справиться с этим ?
Моя первоначальная идея состояла в том, чтобы создать очень большой буферизованный образ из буфера данных, сохраненного в файл на диске. Но я не уверен, что это возможно. Кто-нибудь когда-нибудь делал это ?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.
Для получения дополнительной информации об обработке больших изображений прочитайте эту статью.