Загрузите изображение PNG в Java в виде BufferedImage с помощью кода JNI C
-
20-08-2019 - |
Вопрос
У меня возникла следующая проблема.У меня есть C-код, который получает PNG-изображение в основном как необработанные данные и сохраняет его в памяти.Я бы хотел, чтобы эти необработанные данные были переведены в BufferedImage на Java с помощью JNI.Кто-нибудь знает какой-нибудь способ сделать это или делал это раньше?
Решение
Я предполагаю, что вы знаете основы того, как вызывать функции с помощью JNI.Это не так уж сложно, хотя и может быть занозой в заднице.
Если вы хотите сделать это быстро, просто запишите PNG во временный файл, передайте имя файла через JNI и загрузите его с помощью ImageIO.
Если вы хотите стать более сложным и избежать необходимости указывать путь к файлу, вы можете использовать ImageIO.read(входной поток) на ByteArrayInputStream Байтиррайинпутстрим это оборачивает массив байтов, который вы передаете через JNI.Ты можешь позвонить NewByteArray() Новый массив() из C, а затем используйте SetByteArrayРегион чтобы установить данные.
Наконец, вы могли бы рассмотреть возможность использования HTTP для передачи данных, Apache имеет набор компонентов, которые вы можете использовать которые включают в себя небольшой веб-сервер, вы можете ПЕРЕНЕСТИ свой C-код на Java.
Другие советы
если вы никогда раньше не использовали JNI, я бы порекомендовал вам взглянуть на Руководство и спецификация программиста JNI.
таким образом, то, что вам нужно сделать, это:
- создайте Java-метод с помощью
native
ключевое слово, без реализации. - используйте команду
javah
в классе с собственным методом для генерации файла заголовка (.h).javah
поставляется с установкой JDK. - реализуйте свою родную Java-функцию на C / C ++.
- выполните поиск в классе java.awt.image.BufferedImage.
- найдите конструктор, который вы хотите использовать.
- создайте объект BufferedImage с помощью указанного конструктора.
- выполните поиск методом SetPixel.
- запустите этот метод, чтобы установить значение каждого пикселя в вашем изображении.вам нужно будет запустить его высота x ширина времена.
- верните объект.
- скомпилируйте свой собственный файл в общую библиотеку.
- загрузите свою общую библиотеку внутри вашего Java-класса.
- запустите свой Java-класс, указывающий, связывающий вашу общую библиотеку.
существуют и другие способы копирования необработанных данных вашего изображения, но этого способа, который я объяснил, должно быть достаточно.
Поскольку библиотека Java поддерживает PNG, я бы добавил механизм, который копировал бы все байты из C в Java и использовал класс ImageIO как Чад Окере предполагает.
Кроме того, подумайте об использовании JNA, чтобы облегчить себе жизнь (пример использования JNA для рисования курсора Windows).