C 格式转换

C 格式转换,c,opengl-es,opengl-es-2.0,yuv,rgba,C,Opengl Es,Opengl Es 2.0,Yuv,Rgba,在OpenGL ES 2.0中读取帧缓冲区并将其转换为RGBA帧后。我想把它转换成YUV格式 我试过用这个。忽略α分量。当我这样做,看到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)*

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

我试过用这个。忽略α分量。当我这样做,看到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到yuv的转换忽略了alpha组件


朋友们,这个问题已经解决了。这篇文章太棒了。多亏了Viktor Latypov和MārtiņšMožeiko

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

R=memory[(i*width + j)*4+0]
G=memory[(i*width + j)*4+1]
B=memory[(i*width + j)*4+3]
如果您有BGRA,也可以将0与3交换。

“YUV”不是完整的格式

从中可以获得YUV411、YUV422、YUV420p到YUV444的转换。将这些变换的逆运算与RGB转换相结合,就可以得到结果

您缺少的是:一个RGB三元组可以通过这种方式生成多个(而不是一个)YUV组件

  • YUV444每像素3字节
  • YUV422每2像素4字节
  • YUV411每4像素6字节
  • YUV420p每4像素6字节,重新排序
  • 首先,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值分布在矩形上-请参见Wikipedia的图表和图像


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

    有YUV420p、YUV411、YUV422和YUV444。在应用矩阵之前,前三个必须转换为YUV444。您想要使用的确切YUV格式是什么?@ViktorLatypov:如何将YUV420p YUV411和YUv422转换为YUV444?我只是拿RGB,用上面的公式转换。它必须提供一致的YUV格式。如果我是,请纠正我wrong@Martin我将访问的内存更改为+0+1+3,但结果相同..结果不可能相同@马丁斯谢谢你。我错了这样做之后,我的问题是数据类型。我解决了。再次感谢您在我的案例中,我将RGB组件转换为YUV444。现在我转换成YUV 420。这个答案对我帮助很大:)