c - 格式转换

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

在 OpenGL ES 2.0 中读取帧缓冲区并将其转换为 RGBA 帧后。我想把它转换成 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的空闲空间

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

friend 这个问题解决了。这篇文章给力yuv2rgb .感谢 Viktor Latypov 和 Mārtiņš Možeiko

最佳答案

“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 个字节,重新排序

一、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] 数组。

关于c - 格式转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11220806/

相关文章:

c++ - 如何确定子线程总数?

c - 将 csv 文件读取到结构时出错

c - fgets、sscanf 和写入数组

android - 使用适用于 Android 的 OpenGLEs 绘制像素

ios - 使用 GL_TRIANGLE_STRIP 绘制圆弧

ios - OpenGLES-2 支持 iPod Touch 3G 吗?

c - 反字符 a 到 z

iphone - 在 OpenGL ES View 和 UIKit View Controller 之间切换

g++ - EGL 链接器错误

ios - Xcode 中的帧捕获失败