NDK - 将位图的像素保存到文件

时间:2015-09-14 18:00:54

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

我目前正在尝试使用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位图吗?

同样非常感谢提示/指针。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

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