【问题标题】:Load a PNG image into Java as BufferedImage through JNI C code通过 JNI C 代码将 PNG 图像作为 BufferedImage 加载到 Java 中
【发布时间】:2009-05-09 00:35:01
【问题描述】:

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

【问题讨论】:

    标签: java java-native-interface bufferedimage


    【解决方案1】:

    我假设您了解如何使用 JNI 调用函数的基础知识。这并不复杂,尽管它可能会让人头疼。

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

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

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

    【讨论】:

    • 嘿,乍得,感谢您的评论,这实际上正是我最终要做的,尽管我在实际完成后阅读了如何做 :)
    【解决方案2】:

    如果您以前从未使用过 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 类,指示、链接您的共享库。

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

    【讨论】:

    • 感谢您的回复,我最终换了一种方式。
    【解决方案3】:

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

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

    【讨论】:

    • 嘿,幸运的是我不使用 Windows 做任何事情,所以我不能使用 JNA。感谢您的提醒,如果我切换回 Windows,我会发现这很有用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-27
    • 1970-01-01
    • 2019-10-06
    相关资源
    最近更新 更多