使用 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 的限制,但是当我处理高分辨率图像时,宽度和步幅总是相等的