[数据压缩]RGB文件转换YUV420文件

目录

RGB文件与YUV文件格式

RGB到YUV的转换公式

c++代码实现

结果展示


RGB文件与YUV文件格式

  • RGB文件格式

RGB三个分量按照B、G、R的顺序储存(4:4:4)

  • YUV文件格式

此次选用YUV420文件格式,每四个Y共用一组U、V分量(4:2:0)
 

RGB到YUV的转换公式

Y = 0.299 R + 0.587 G + 0.114 B

U = - 0.1687 R - 0.3313 G + 0.5 B + 128

V = 0.5 R - 0.4187 G - 0.0813 B + 128

c++代码实现

#include <stdio.h>
#include <cstring>
#include <cstdlib>
using namespace std;
int main(int argc, char* argv[])
{
    FILE *fp = NULL;
    FILE *out_yuv = NULL;
    if (!(fp=fopen(argv[1], "rb")))
    {
        printf("输入rgb文件打开失败!\n");
    }
    if (!(out_yuv=fopen( argv[2], "wb") ))
    {
        printf("输出yuv文件打开失败!\n");
    }
    int w,h;
    w = atoi(argv[3]);
    h = atoi(argv[4]);

    unsigned char* buffer = (unsigned char *)malloc(sizeof(unsigned char)*w*h * 3);
    unsigned char* ybuf = (unsigned char *)malloc(sizeof(unsigned char)*w*h);
    unsigned char* ubuf = (unsigned char *)malloc(sizeof(unsigned char)*w*h/4);
    unsigned char* vbuf = (unsigned char *)malloc(sizeof(unsigned char)*w*h/4);
    fread(buffer, sizeof(unsigned char), 3 * w * h, fp);

    int uvnum=0;
    for (int i = 0; i < w*h; i++)
    {
        ybuf[i] = 0.299 * buffer[3 * i + 2] + 0.587 * buffer[3 * i + 1] + 0.114 * buffer[3 * i];
        if (ybuf[i] <= 15)
            ybuf[i] = 16;
        if (ybuf[i] >=236)
            ybuf[i] =235;
    }
    for(int i = 0;i < h;i++) {
        for (int j = 0; j < w; j++) {
            if (i % 2 == 0 && j % 2 == 0) {
                ubuf[uvnum] = -0.1684 * buffer[3 * (i * w + j) + 2] - 0.3316 * buffer[3 * (i * w + j) + 1]
                              + 0.5 * buffer[3 * (i * w + j)] + 128;
                if (ubuf[i] <= 15)
                    ubuf[i] = 16;
                if (ubuf[i] >= 241)
                    ubuf[i] = 240;
                vbuf[uvnum] = 0.5 * buffer[3 * (i * w + j) + 2] - 0.4187 * buffer[3 * (i * w + j) + 1]
                              - 0.0183 * buffer[3 * (i * w + j)] + 128;
                if (vbuf[uvnum] <= 15)
                    vbuf[uvnum] = 16;
                if (vbuf[uvnum] >= 241)
                    vbuf[uvnum] = 240;
                uvnum++;
            }
        }
    }
    fwrite(ybuf, sizeof(unsigned char), w*h, out_yuv);
    fwrite(ubuf, sizeof(unsigned char), w*h / 4, out_yuv);
    fwrite(vbuf, sizeof(unsigned char), w*h / 4, out_yuv);
    fclose(fp);
    fclose(out_yuv);
    free(buffer);
    free(ybuf);
    free(ubuf);
    free(vbuf);
    getchar();
    return 0;
}

并设置命令行参数

​​​​​​​ 

结果展示

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在线RGB颜色YUV转换器是一种在线工具,用于转换RGB颜色模式到YUV颜色模式。RGB代表红、绿、蓝,而YUV代表亮度、色度和饱和度。这个转换器的作用是帮助用户将RGB颜色格式转换YUV格式,这在数字图像和视频处理中非常常见。 使用在线RGB颜色YUV转换器,只需输入所需转换RGB颜色值,例如红色值为255,绿色值为0,蓝色值为0。然后点击“转换”按钮,即可得到其相应的YUV颜色值。这个转换器还提供了可视化效果,即用户在输入RGB值后,会在网页的右侧看到相应的颜色块,以便用户看到他们的RGB颜色是什么样的。 在实际应用中,将RGB颜色格式转换YUV格式的目的是为了压缩数字视频流。YUV模式更适合于视频编码,因为例如红色和绿色的像素虽然颜色不同,但在人眼中看起来差别不大,可以合并成一个颜色。同时,YUV模式中的亮度(Y)更重要,还可以通过调整Y的值来控制图像的亮度。因此,将RGBYUV是数字视频和图像处理中的一个重要步骤,这个在线转换器大大简化了这个过程。 ### 回答2: 一款在线RGB颜色YUV转换器是一种非常实用的工具,可以用于将 RGB 颜色值转换YUV 颜色空间中的对应值。在许多图像处理和视频处理应用中都需要使用 YUV 颜色空间,所以这样的转换器非常有用。 通过这款在线转换器,您可以将 RGB 颜色值输入到指定的输入框中,然后将它们转换YUV 颜色空间中的对应值。转换后,您可以看到输出的 YUV 值,并且可以将它们用于进一步处理。 转换RGB颜色到YUV颜色的过程非常简单。RGB 颜色是由红、绿和蓝三个通道的值组成的,而 YUV 颜色则是由亮度(Y)和色度(U、V)组成的。因此,转换过程就是将 RGB 颜色值分别转换为相应的 Y、U、V 值。具体的数学计算公式可以通过在线转换器中的算法实现。 这样的在线转换器不仅简单易用,而且非常方便。如果您需要在任何地方进行颜色处理或者视频处理,只需要打开浏览器,访问这个网站,就可以快速地将 RGB 颜色值转换YUV 颜色空间中的对应值。 ### 回答3: 在线RGB颜色YUV转换器是一种网络工具,用于将RGB颜色格式转换YUV颜色格式。RGB颜色格式是一种基于红色(R)、绿色(G)、蓝色(B)的颜色系统,广泛应用于电子设备显示屏幕、视频摄像头等领域;而YUV颜色格式则是一种基于亮度(Y)、色度(U)、色度(V)的颜色系统,主要用于数字视频压缩和传输中。 在线RGB颜色YUV转换器通常支持多种RGBYUV颜色格式之间的转换,例如RGB24、RGB32、YUV444、YUV422、YUV420等格式。使用者可以将需要转换RGB颜色值输入到工具中,该工具将根据用户选定的RGB颜色格式自动进行转换,输出对应的YUV颜色值。这个转换过程是通过对RGB像素中红绿蓝通道进行加权处理,以获取亮度和两个色度信号得到的。 在线RGB颜色YUV转换器适用于多种应用场景,例如构建数字视频系统、进行数字视频编辑、对图像进行编码、解码等。它不仅能够提高工作效率,还可以防止人为转换错误所带来的一系列问题,为用户提供更加准确、可靠的颜色转换服务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值