【问题标题】:NDK - Save Bitmap's pixels to FileNDK - 将位图的像素保存到文件
【发布时间】:2015-09-14 18:00:53
【问题描述】:

我目前正在尝试使用 NDK 保存位图而不恢复 Java 对象,而是直接使用 C++ 像素数组。

我已经将位图存储在 JniBitmapHolder 中,并且可以成功获取存储的像素。我想尝试在不调用 Bitmap.create 方法的情况下保存它们。

目前我正在尝试这样做(没有成功):

Util.saveImageSync(Util.getOutputMediaFile("filtered"), jniBitmap.getBitmapArray());

并且方法是这样实现的:

public static void saveImageSync(final File outputFile, final ByteBuffer buffer){
    FileOutputStream out = null;
    try {
        out = new FileOutputStream(outputFile);
        out.getChannel().write(buffer);
    } catch (Exception e) {
        Dbg.d("ERROR", e);
    } finally {
        try {
            if (out != null) {
                out.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

我已将方法 getBitmaArray 添加到库中,如下所示:

JNIEXPORT jobject JNICALL Java_com_jni_bitmap_1operations_JniBitmapHolder_jniGetBitmapArray(
    JNIEnv * env, jobject obj, jobject handle) {
JniBitmap *jniBitmap = (JniBitmap *) env->GetDirectBufferAddress(handle);
jniBitmap->_storedBitmapPixels;
return env->NewDirectByteBuffer(jniBitmap->_storedBitmapPixels, 0);

}

但似乎直接像素阵列不够或不正确。有没有其他想法直接将像素保存到文件而不需要创建 Java 位图?

也非常感谢提示/指针。

【问题讨论】:

    标签: java android c++ bitmap android-ndk


    【解决方案1】:

    是的,您需要编写位图标头来创建兼容文件。请参阅 Writing BMP image in pure c/c++ without other libraries 了解如何从本机代码完成此操作。

    【讨论】:

    • 问题,即使我希望将其保存为 .jpg(原始文件确实是 .jpg)而不是 .bmp 文件,它是否有效?还是谢谢你的回答:)
    • 我不明白你的用例。如果你有一个 JPEG 并且想将它写入文件,为什么你需要一个位图?
    • with bitmap 我的意思是Android的Bitmap类。我已经使用 Universal Image Loader 从网上下载了 2 个 JPEG,它返回了一个 Bitmap 对象。然后我创建了像素的修改版本,但我不想创建一个新的Bitmap对象只是为了将它返回给java并保存它..我想直接保存它。是的,它是位图,但属于 JPEG 文件。对不起,如果我不是那么清楚:)
    • 如果你修改了一些像素,那么它最初来自JPEG的事实将无济于事。您可以在本机中将位图压缩为 JPEG,而无需通过 Java。看看libjpeg-turbo
    【解决方案2】:

    经过一番进一步调查,最快的方法是保留一个支持位图,将其传递给C++,而不是每次使用该函数时都创建一个新的位图,然后直接使用它直接使用Java方法来保存像素。

    感谢 Alex 的回答 :) 实际上问题是缺少标题。

    【讨论】:

      猜你喜欢
      • 2011-05-08
      • 1970-01-01
      • 1970-01-01
      • 2013-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-31
      相关资源
      最近更新 更多