Загрузите изображение PNG в Java как BufferedImage через код JNI C - PullRequest
2 голосов
/ 09 мая 2009

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

Ответы [ 3 ]

4 голосов
/ 09 мая 2009

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

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

Если вы хотите стать более сложным и избежать необходимости пути к файлу, вы можете использовать ImageIO.read (InputStream) для ByteArrayInputStream , который оборачивает передаваемый вами байтовый массив через JNI. Вы можете вызвать NewByteArray () из C и затем использовать SetByteArrayRegion для установки данных.

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

1 голос
/ 09 мая 2009

, если вы никогда раньше не использовали 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, указав ссылку на вашу совместно используемую библиотеку.

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

0 голосов
/ 09 мая 2009

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

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

...