格式转换

时间:2012-06-27 06:49:36

标签: c opengl-es opengl-es-2.0 yuv rgba

在读取帧缓冲区并将其转换为RGBA帧后,在OpenGL ES 2.0中。我想将其转换为YUV格式。

我尝试使用此table。哪个忽略了alpha组件。当我这样做,并看到YUV帧生成其扭曲。

任何人都可以帮助我

yuvdata[i * j *1]= (0.257)*memory[i*j*1] + (0.504)*memory[i*j*2]+(0.098)*memory[i*j*3]+16;
yuvdata[i * j *3]= (0.439)*memory[i*j*1] - (0.368)*memory[i*j*2] -(0.071)*memory[i*j*3]+128;
yuvdata[i * j *2]= -(0.148)*memory[i*j*1] - (0.291)*memory[i*j*2] +(0.439)*memory[i*j*3]+128;

`

规范化没有帮助 记忆库rgba 和yuv是存储yuv的免费空间

我使用rgb来忽略alpha分量的yuv转换

朋友这个问题已经解决了。这篇文章真棒yuv2rgb。感谢Viktor Latypov和MārtiņšMožeiko

2 个答案:

答案 0 :(得分:1)

“YUV”不是一个完整的格式。

this wikipedia article,您可以获得YUV411,YUV422,YUV420p到YUV444的转换。将这些变换的逆与RGB转换相结合,您将得到结果。

你缺少的东西:一个RGB三元组可以用这种方式产生一个(而不是一个)YUV组件。

  1. YUV444每像素3个字节
  2. YUV422每2像素4个字节
  3. YUV411每4像素6个字节
  4. YUV420p每4像素6个字节,重新排序
  5. 首先,YUV422

    Y'UV422到RGB888的转换

    输入:读取4个字节的Y'UV(u,y1,v,y2)

    输出:写入6个字节的RGB(R,G,B,R,G,B)

    然后是YUV4111

    Y'UV411到RGB888的转换

    输入:读取6个字节的Y'UV

    输出:写入12个字节的RGB

    // Extract YUV components
    u  = yuv[0];
    y1 = yuv[1];
    y2 = yuv[2];
    v  = yuv[3];
    y3 = yuv[4];
    y4 = yuv[5];
    rgb1 = Y'UV444toRGB888(y1, u, v);
    rgb2 = Y'UV444toRGB888(y2, u, v);
    rgb3 = Y'UV444toRGB888(y3, u, v);
    rgb4 = Y'UV444toRGB888(y4, u, v);
    

    与420p类似,但YUV值分布在那里的矩形上 - 请参阅维基百科的图表和图像。

    基本上,你应该获取4个RGB像素,将它们中的每一个转换为YUV(使用你希望有效的444转换器),然后以维基百科上显示的棘手方式存储YUV [4]数组。

答案 1 :(得分:0)

您确定正确访问内存阵列吗?不应该是这样的:

R=memory[(i*width + j)*4+0]
G=memory[(i*width + j)*4+1]
B=memory[(i*width + j)*4+3]
如果您有BGRA,则

或与0交换0。