是否将窗口缓冲区正确保存到android位图?

是否将窗口缓冲区正确保存到android位图?,android,android-ndk,Android,Android Ndk,目前,我正在使用下一个代码保存图像1920x1080,效果非常好: AndroidBitmapInfo info; void saveBufferToBitmap(JNIEnv *env, ANativeWindow_Buffer *buffer, jobject bitmap) { void *pixels; LOGI(10, "saving buffer to bitmap"); if (AndroidBitmap_getInfo(env, bitmap, &a

目前,我正在使用下一个代码保存图像1920x1080,效果非常好:

AndroidBitmapInfo info;

void saveBufferToBitmap(JNIEnv *env, ANativeWindow_Buffer *buffer, jobject bitmap) {
    void *pixels;

    LOGI(10, "saving buffer to bitmap");

    if (AndroidBitmap_getInfo(env, bitmap, &info) < 0) {
        LOGE(10, "Failed to get bitmap info");
            return;
    }

    if (AndroidBitmap_lockPixels(env, bitmap, &pixels) < 0) {
        LOGE(10, "Failed to lock pixles for bitmap");
        return;
    }

    int i, scan_length;
    scan_length = buffer->width * 4;

    memcpy(pixels, buffer->bits, buffer->width * buffer->height * 4); // 4 = (rgba)

    AndroidBitmap_unlockPixels(env, bitmap);
}

我应该如何修改上面的代码以使其适用于2048图像?为什么步幅大于缓冲区宽度

经过几次尝试,我找到了解决方案-跳过步幅宽度字节:

AndroidBitmapInfo info;

void saveBufferToBitmap(JNIEnv *env, ANativeWindow_Buffer *buffer, jobject bitmap) {
    void *pixels;

    LOGI(10, "saving buffer to bitmap");

    if (AndroidBitmap_getInfo(env, bitmap, &info) < 0) {
        LOGE(10, "Failed to get bitmap info");
            return;
    }

    if (AndroidBitmap_lockPixels(env, bitmap, &pixels) < 0) {
        LOGE(10, "Failed to lock pixles for bitmap");
        return;
    }

    int i, scan_length = buffer->width * 4;

    // we need to skip (stride) bytes, not (width) as stride can be > width for some reason
    int scan_skip_bytes = buffer->stride * 4;

    unsigned char *fromBuffer = buffer->bits;
    unsigned char *toBuffer = (unsigned char*)pixels;

    for (i=0; i<buffer->height; i++) {
        memcpy(toBuffer, fromBuffer, scan_length);

        fromBuffer += scan_skip_bytes;
        toBuffer += scan_length;
    }

    AndroidBitmap_unlockPixels(env, bitmap);
}
AndroidBitmapInfo info;

void saveBufferToBitmap(JNIEnv *env, ANativeWindow_Buffer *buffer, jobject bitmap) {
    void *pixels;

    LOGI(10, "saving buffer to bitmap");

    if (AndroidBitmap_getInfo(env, bitmap, &info) < 0) {
        LOGE(10, "Failed to get bitmap info");
            return;
    }

    if (AndroidBitmap_lockPixels(env, bitmap, &pixels) < 0) {
        LOGE(10, "Failed to lock pixles for bitmap");
        return;
    }

    int i, scan_length = buffer->width * 4;

    // we need to skip (stride) bytes, not (width) as stride can be > width for some reason
    int scan_skip_bytes = buffer->stride * 4;

    unsigned char *fromBuffer = buffer->bits;
    unsigned char *toBuffer = (unsigned char*)pixels;

    for (i=0; i<buffer->height; i++) {
        memcpy(toBuffer, fromBuffer, scan_length);

        fromBuffer += scan_skip_bytes;
        toBuffer += scan_length;
    }

    AndroidBitmap_unlockPixels(env, bitmap);
}