通过JNI C代码将PNG图像作为BufferedImage加载到Java中
我有以下问题。 我有C代码,它将PNG图像作为基本原始数据获取并将其保存在内存中。 我希望通过使用JNI将这些原始数据转换为Java中的BufferedImage。 有谁知道这样做或以前做过这个?
我假设您了解如何使用JNI调用函数的基础知识。 它并不复杂,虽然它可能是一个痛苦的屁股。
如果您想快速完成它,只需将PNG写入临时文件,通过JNI传递文件名并使用ImageIO加载它。
如果您想要更复杂,并且避免需要文件路径,可以在ByteArrayInputStream上使用ImageIO.read(InputStream) ,它包装您通过JNI传入的字节数组。 您可以从C调用NewByteArray() ,然后使用SetByteArrayRegion来设置数据。
最后,您可以考虑使用HTTP来传输数据,Apache 有一组可以使用的组件 ,包括一个小的Web服务器,您可以从C代码POST到Java。
如果您之前从未使用过JNI,我建议您查看JNI程序员指南和规范 。
总之,你要做的是:
- 使用
native
关键字创建Java方法,没有实现。 - 使用本机方法在类上使用命令
javah
来生成头文件(.h)。javah
附带JDK安装。 - 在C / C ++中实现您的本机Java函数。
- 搜索类java.awt.image.BufferedImage。
- 搜索您要使用的构造函数。
- 使用指定的构造函数创建BufferedImage对象。
- 搜索setPixel方法。
- 运行该方法来设置图像中的每个像素值。 你需要运行它的高度 x 宽度时间。
- 返回对象。
- 将您的本机文件编译为共享库。
- 在Java类中加载共享库。
- 运行Java类,指示链接共享库。
还有其他方法可以复制图像的原始数据,但我解释的这种方式应该足够了。
由于Java库支持PNG,我将添加一种机制,将所有字节从C复制到Java,并使用ImageIO类,如Chad Okere所建议的那样。
另外,考虑使用JNA使生活更轻松( 例如使用JNA绘制Windows游标 )。