Загрузите изображение PNG в Java в виде BufferedImage с помощью кода JNI C

StackOverflow https://stackoverflow.com/questions/842386

Вопрос

У меня возникла следующая проблема.У меня есть C-код, который получает PNG-изображение в основном как необработанные данные и сохраняет его в памяти.Я бы хотел, чтобы эти необработанные данные были переведены в BufferedImage на Java с помощью JNI.Кто-нибудь знает какой-нибудь способ сделать это или делал это раньше?

Это было полезно?

Решение

Я предполагаю, что вы знаете основы того, как вызывать функции с помощью JNI.Это не так уж сложно, хотя и может быть занозой в заднице.

Если вы хотите сделать это быстро, просто запишите PNG во временный файл, передайте имя файла через JNI и загрузите его с помощью ImageIO.

Если вы хотите стать более сложным и избежать необходимости указывать путь к файлу, вы можете использовать ImageIO.read(входной поток) на ByteArrayInputStream Байтиррайинпутстрим это оборачивает массив байтов, который вы передаете через JNI.Ты можешь позвонить NewByteArray() Новый массив() из C, а затем используйте SetByteArrayРегион чтобы установить данные.

Наконец, вы могли бы рассмотреть возможность использования HTTP для передачи данных, Apache имеет набор компонентов, которые вы можете использовать которые включают в себя небольшой веб-сервер, вы можете ПЕРЕНЕСТИ свой C-код на Java.

Другие советы

если вы никогда раньше не использовали JNI, я бы порекомендовал вам взглянуть на Руководство и спецификация программиста JNI.

таким образом, то, что вам нужно сделать, это:

  1. создайте Java-метод с помощью native ключевое слово, без реализации.
  2. используйте команду javah в классе с собственным методом для генерации файла заголовка (.h). javah поставляется с установкой JDK.
  3. реализуйте свою родную Java-функцию на C / C ++.
    1. выполните поиск в классе java.awt.image.BufferedImage.
    2. найдите конструктор, который вы хотите использовать.
    3. создайте объект BufferedImage с помощью указанного конструктора.
    4. выполните поиск методом SetPixel.
    5. запустите этот метод, чтобы установить значение каждого пикселя в вашем изображении.вам нужно будет запустить его высота x ширина времена.
    6. верните объект.
  4. скомпилируйте свой собственный файл в общую библиотеку.
  5. загрузите свою общую библиотеку внутри вашего Java-класса.
  6. запустите свой Java-класс, указывающий, связывающий вашу общую библиотеку.

существуют и другие способы копирования необработанных данных вашего изображения, но этого способа, который я объяснил, должно быть достаточно.

Поскольку библиотека Java поддерживает PNG, я бы добавил механизм, который копировал бы все байты из C в Java и использовал класс ImageIO как Чад Окере предполагает.

Кроме того, подумайте об использовании JNA, чтобы облегчить себе жизнь (пример использования JNA для рисования курсора Windows).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top