YUV 转 RGB 和 CreateBitmap ......格式是啥?

Posted

技术标签:

【中文标题】YUV 转 RGB 和 CreateBitmap ......格式是啥?【英文标题】:YUV to RGB and CreateBitmap...which is the format?YUV 转 RGB 和 CreateBitmap ......格式是什么? 【发布时间】:2014-09-08 11:56:04 【问题描述】:

我不是图像格式方面的专家。我正在测试相机的帧速率性能。 当我将数据从 YUV 转换为 RGB 时,这个数据是哪种 RGB 格式的? RGB565 还是 argb8888? 为什么 createBitmap 需要很长时间?向原始数据添加信息?

【问题讨论】:

希望是 888,因为 565 会丢失很多细节。你用什么来执行转换?创建位图需要很长时间,因为相机图像很大并且需要移动大量数据。 【参考方案1】:

这是rgb代码

public int[] YUV_NV21_TO_RGB( byte[] yuv, int width, int height) 
    final int frameSize = width * height;
    int[] argb = new int[width*height];

    final int ii = 0;
    final int ij = 0;
    final int di = +1;
    final int dj = +1;

    int a = 0;
    for (int i = 0, ci = ii; i < height; ++i, ci += di) 
        for (int j = 0, cj = ij; j < width; ++j, cj += dj) 
            int y = (0xff & ((int) yuv[ci * width + cj]));
            int v = (0xff & ((int) yuv[frameSize + (ci >> 1) * width + (cj & ~1) + 0]));
            int u = (0xff & ((int) yuv[frameSize + (ci >> 1) * width + (cj & ~1) + 1]));
            y = y < 16 ? 16 : y;

            int a0 = 1192 * (y - 16);
            int a1 = 1634 * (v - 128);
            int a2 = 832 * (v - 128);
            int a3 = 400 * (u - 128);
            int a4 = 2066 * (u - 128);

            int r = (a0 + a1) >> 10;
            int g = (a0 - a2 - a3) >> 10;
            int b = (a0 + a4) >> 10;

            r = r < 0 ? 0 : (r > 255 ? 255 : r);
            g = g < 0 ? 0 : (g > 255 ? 255 : g);
            b = b < 0 ? 0 : (b > 255 ? 255 : b);

            argb[a++] = 0xff000000 | (r << 16) | (g << 8) | b;
        
    


    return argb;

问题是,如果我使用带有 RGB_565 选项的 CreateBitmap,时间至少比 ARGB8888 快 10 毫秒。 如果 RGB_565 是一种压缩(数据丢失),不应该相反(createBitmap with ARGB888 比 RGB_565 快)?

【讨论】:

以上是关于YUV 转 RGB 和 CreateBitmap ......格式是啥?的主要内容,如果未能解决你的问题,请参考以下文章

yuv420p 转rgb计算

如何把摄像头采集的rgb图像转成yuv格式,并进行H264硬编码?

如何将rgb 模式转换成 yuv 模式

图像RGB2YUV与YUV2RGB格式互转介绍

FPGA_verilog_RGB转YUV代码分享

iOS音视频采集与格式转换(yuv转rgb)