使用 Android ANativeWindow 渲染位图
rendering bitmap using Android ANativeWindow
我遇到了位图未在表面视图上正确呈现的问题。
渲染是使用 ANativeWindow 在本机层中完成的。为了确认我从相机收到的图像是好的,我将缓冲区转储到文件系统上,它看起来不错,但是当尝试渲染它时,它显示如下图。
下面是我尝试将位图复制到 ANativeWindow 的方法。
static int counter = 0;
std::string name = "/sdcard/irImage" + std::to_string(counter++) + ".png";
stbi_write_png(name.c_str(), WIDTH, HEIGHT, 4, mFormattedIRBuffer, WIDTH*4);
ANativeWindow_Buffer buffer;
if (_window)
{
if (ANativeWindow_lock(_window, &buffer, NULL) == 0)
{
memcpy(buffer.bits, mFormattedIRBuffer, WIDTH * HEIGHT * 4);
ANativeWindow_unlockAndPost(_window);
}
}
当我尝试渲染单一颜色(紫色、黄色、粉红色)时,它在表面视图上正确显示。
知道我在这里遗漏了什么吗?
更新:
出于某种原因 buffer.stride 与 buffer.width 不同,我认为这是导致表面视图失真的原因。我使用的分辨率是 224x171
步幅似乎是 256。当使用更高分辨率时,我没有这个问题。步幅始终与图像的宽度相同。
为了克服 buffer.width 与 buffer.stride 不同的问题,我不得不填充图像的宽度以匹配步幅。我的宽度 = 224 和步幅 = 256,所以我在左侧使用 16 的填充,在右侧使用 16 的填充。我不确定在处理低分辨率图像时这是否是 ANativeWindow 的限制,但是当我处理高分辨率图像时,宽度和步幅总是相等的
我遇到了位图未在表面视图上正确呈现的问题。 渲染是使用 ANativeWindow 在本机层中完成的。为了确认我从相机收到的图像是好的,我将缓冲区转储到文件系统上,它看起来不错,但是当尝试渲染它时,它显示如下图。
下面是我尝试将位图复制到 ANativeWindow 的方法。
static int counter = 0;
std::string name = "/sdcard/irImage" + std::to_string(counter++) + ".png";
stbi_write_png(name.c_str(), WIDTH, HEIGHT, 4, mFormattedIRBuffer, WIDTH*4);
ANativeWindow_Buffer buffer;
if (_window)
{
if (ANativeWindow_lock(_window, &buffer, NULL) == 0)
{
memcpy(buffer.bits, mFormattedIRBuffer, WIDTH * HEIGHT * 4);
ANativeWindow_unlockAndPost(_window);
}
}
当我尝试渲染单一颜色(紫色、黄色、粉红色)时,它在表面视图上正确显示。
知道我在这里遗漏了什么吗?
更新:
出于某种原因 buffer.stride 与 buffer.width 不同,我认为这是导致表面视图失真的原因。我使用的分辨率是 224x171 步幅似乎是 256。当使用更高分辨率时,我没有这个问题。步幅始终与图像的宽度相同。
为了克服 buffer.width 与 buffer.stride 不同的问题,我不得不填充图像的宽度以匹配步幅。我的宽度 = 224 和步幅 = 256,所以我在左侧使用 16 的填充,在右侧使用 16 的填充。我不确定在处理低分辨率图像时这是否是 ANativeWindow 的限制,但是当我处理高分辨率图像时,宽度和步幅总是相等的