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

时间:2009-05-09 00:35:01

标签: java java-native-interface bufferedimage

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

3 个答案:

答案 0 :(得分:4)

我假设您了解如何使用JNI调用函数的基础知识。它并不复杂,虽然它可能是一个痛苦的屁股。

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

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

最后,您可以考虑使用HTTP来传输数据,包括一个小型Web服务器的Apache has a set of components you can use,您可以从C代码发送到Java。

答案 1 :(得分:1)

如果您以前从未使用过JNI,我建议您查看JNI Programmer's Guide and Specification

总之,您需要做的是:

  1. 使用native关键字创建一个Java方法,但没有实现。
  2. 使用本机方法在类上使用命令javah来生成头文件(.h)。 javah附带JDK安装。
  3. 在C / C ++中实现您的本机Java函数。
    1. 搜索类java.awt.image.BufferedImage。
    2. 搜索您要使用的构造函数。
    3. 使用指定的构造函数创建BufferedImage对象。
    4. 搜索setPixel方法。
    5. 运行该方法来设置图像中的每个像素值。你需要运行 height x width 次。
    6. 返回对象。
  4. 将您的本机文件编译为共享库。
  5. 将您的共享库加载到Java类中。
  6. 运行您的Java类,指示链接您的共享库。
  7. 还有其他方法可以复制图像的原始数据,但我解释的这种方式应该足够了。

答案 2 :(得分:0)

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

另外,考虑使用JNA让生活更轻松(example using JNA to draw a Windows cursor)。