是否将窗口缓冲区正确保存到android位图?
目前,我正在使用下一个代码保存图像1920x1080,效果非常好:是否将窗口缓冲区正确保存到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
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);
}