繁体   English   中英

通过JNI C代码将PNG图像作为BufferedImage加载到Java中

[英]Load a PNG image into Java as BufferedImage through JNI C code

我有以下问题。 我有C代码,基本上将PNG图像获取为原始数据并将其保存在内存中。 我希望通过使用JNI将原始数据转换为Java中的BufferedImage。 有谁知道这样做或以前做过的任何方式?

我假设您了解如何使用JNI调用函数的基础知识。 它并没有那么复杂,尽管可能会让人感到痛苦。

如果要快速完成,只需将PNG写入临时文件,通过JNI传递文件名,然后使用ImageIO加载它。

如果您想变得更复杂,并且避免需要文件路径,则可以在ByteArrayInputStream上使用ImageIO.read(InputStream) ,该数组包装通过JNI传递的字节数组。 您可以从C调用NewByteArray() ,然后使用SetByteArrayRegion设置数据。

最后,您可能考虑使用HTTP传输数据,Apache 可以使用一组组件 ,其中包括一个小型Web服务器,您可以将C代码发布到Java。

如果您以前从未使用过JNI,建议您阅读JNI程序员指南和规范

总之,您需要做的是:

  1. 使用native关键字创建Java方法,而无需实现。
  2. 在带有本机方法的类上使用命令javah生成头文件(.h)。 javah随附JDK安装。
  3. 在C / C ++中实现您的本机Java函数。
    1. 搜索类java.awt.image.BufferedImage。
    2. 搜索您要使用的构造函数。
    3. 使用指定的构造函数创建一个BufferedImage对象。
    4. 搜索setPixel方法。
    5. 运行该方法来设置图像中的每个像素值。 您需要将其高度 x 宽度乘以它。
    6. 返回对象。
  4. 将您的本机文件编译到共享库中。
  5. 将共享库加载到Java类中。
  6. 运行指示链接共享库的Java类。

还有其他方法可以复制图像的原始数据,但是我解释过的这种方式应该足够了。

由于Java库支持PNG,因此我将添加一种机制,将所有字节从C复制到Java并按照Chad Okere的建议使用ImageIO类。

另外,考虑使用JNA来简化生活( 例如,使用JNA绘制Windows光标 )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM