通过 JNI C 代码将 PNG 图像作为 BufferedImage 加载到 Java 中
-
20-08-2019 - |
题
我有以下问题。我有 C 代码,它获取 PNG 图像作为基本原始数据并将其保存在内存中。我希望通过使用 JNI 将这些原始数据转换为 Java 中的 BufferedImage。有谁知道这样做的任何方法或以前做过吗?
解决方案
我假设您了解如何使用 JNI 调用函数的基础知识。事情并没有那么复杂,尽管可能会很麻烦。
如果您想快速完成,只需将 PNG 写入临时文件,通过 JNI 向上传递文件名并使用 ImageIO 加载它。
如果您想变得更复杂,并且避免需要文件路径,您可以使用 ImageIO.read(输入流) 在一个 字节数组输入流 它包装了您通过 JNI 传入的字节数组。您可以致电 新字节数组() 从 C 然后使用 设置字节数组区域 设置数据。
最后,你可能会考虑使用HTTP来传输数据,Apache 有一组您可以使用的组件 包含一个小型 Web 服务器,您可以将 C 代码 POST 到 Java。
其他提示
如果你从来没有使用JNI之前,我建议你看看 JNI程序的指导和说明书.
总之,你有什么要做的是:
- 创建一个Java方法
native
关键词,与没有实现。 - 使用的命令
javah
在这类地方法产生的一标题的文件(.h)。javah
配有JAVA安装。 - 实现你的母Java功能在C/C++。
- 搜索类java。awt.图像。BufferedImage.
- 搜索的构造你想要使用。
- 创建一个BufferedImage目的指定的构造。
- 搜索setPixel方法。
- 运行的方法来设定各像素的价值,在你的形象。你会需要运行它 高度 x 宽 倍。
- 返回的对象。
- 编译是你的母文件纳入一个共用图书馆。
- 负载的共享图书馆内部Java类。
- 运行Java类的指示,联你共用图书馆。
还有其他方法复制的原始数据的图像,但是这种方式我解释应该是足够的。
由于 Java 库支持 PNG,我将添加一种机制,将所有字节从 C 复制到 Java 并使用 ImageIO 类作为 查德·奥克雷 建议。
另外,考虑使用 JNA 让生活更轻松(使用 JNA 绘制 Windows 光标的示例).
不隶属于 StackOverflow