LIBYUV
+ -

libyuv::I420ToBGRA

2024-08-23 24 0

libyuv 是一个由 Google 开发的用于进行图像颜色空间转换的库,其包含多种高效的函数,用于处理如 YUV 到 RGB 的转换等任务。I420ToBGRA 函数可以将 I420 格式的图像转换为 BGRA 格式的图像。

以下是一个简单的示例,展示了如何使用 libyuv::I420ToBGRA 函数来转换一个分辨率为 1280x720 的图像:

#include <libyuv.h>
#include <iostream>

int main() {
    const int width = 1280;
    const int height = 720;

    // 分配内存空间
    uint8_t* i420_data = new uint8_t[width * height * 3 / 2]; // I420 需要 1.5 倍于宽高的空间
    uint8_t* bgra_data = new uint8_t[width * height * 4];     // BGRA 需要 4 倍于宽高的空间

    // 假设 i420_data 已经被填充了有效的 I420 数据
    // ...

    // 使用 libyuv 进行转换
    int result = libyuv::I420ToBGRA(i420_data, width,
                                    i420_data + width * height, width / 2,
                                    i420_data + width * height * 5 / 4, width / 2,
                                    bgra_data, width * 4,
                                    width, height);

    if (result != 0) {
        std::cerr << "libyuv::I420ToBGRA failed with error code: " << result << std::endl;
        return -1;
    }

    // 现在 bgra_data 包含了转换后的 BGRA 数据
    // 可以进行后续处理,比如保存到文件或显示到屏幕上
    // ...

    // 释放内存空间
    delete[] i420_data;
    delete[] bgra_data;

    return 0;
}

注意:

  1. 在上面的示例中,我假设 i420_data 已经被填充了有效的 I420 数据。在实际应用中,你可能需要从某个源(如摄像头、视频文件等)获取这些数据。
  2. I420ToBGRA 函数的参数可能看起来有点复杂,因为它需要分别传入 Y、U 和 V 平面的数据。在 I420 格式中,Y 平面是首先存储的,后面跟着 U 和 V 平面,它们的宽度是原始宽度的一半,高度与原始高度相同。这就是为什么在分配 i420_data 时我们使用了 width * height * 3 / 2 的大小。
  3. 如果转换成功,libyuv::I420ToBGRA 函数将返回 0。否则,它将返回一个错误代码,你可以根据这个错误代码来调试问题。

0 篇笔记 写笔记

I420/YU12/YUV420P/IYUV格式详解
I420介绍I420也叫YU12,也叫 IYUV,属于 YUV420P 格式。三个平面,分别存储 Y U V 分量。每四个 Y 分量共享一组 UV 分量。U、V 平面的 strides, width 和 height 都是 Y 平面的一半,因此一个像素 12 bits。I420字节大小4:2:0......
libyuv::I420ToBGRA
libyuv 是一个由 Google 开发的用于进行图像颜色空间转换的库,其包含多种高效的函数,用于处理如 YUV 到 RGB 的转换等任务。I420ToBGRA 函数可以将 I420 格式的图像转换为 BGRA 格式的图像。以下是一个简单的示例,展示了如何使用 libyuv::I420ToBGR......
作者信息
站长漫谈
取消
感谢您的支持,我会继续努力的!
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

您的支持,是我们前进的动力!