使用C#将RGB24转换为YUV420格式

最近使用阿里云推送本地视频数据到远端播放!需要将图像数据转换为YUV420格式的,网上大部分是C++写的,这里将代码转换为C#格式,记录如下!

1.原料准备!首先我们获得RGB原始数据,这里不能使用JPG等压缩格式图片,需要先将图片转换为RGB格式的裸数据保存!这里提供一个网站 ,可以做转换!Convertio — 文件转换器

2.转码:使用下面的代码即可转换为YUV420!有需要的同学可以试试看!

 FileStream fs = new FileStream("./test.rgb", FileMode.Open);
            BinaryReader br = new BinaryReader(fs);
            int length = (int)fs.Length;
            byte[] yuv = br.ReadBytes((int)fs.Length);
            br.Close();
            fs.Close();


            //将RGB 数据转化为420后传递
            //1.读取RGB数据

            int Height = 240;
            int Width = 320;

            byte r, g, b;

            byte[] yuvList = new byte[Width * Height * 3 / 2]; //存储YUV数据

            //2.转为YUV数据 
            // 开始数据转换
            int count = 0;
            int ycount = 0;
            for (int i = 0; i < Height; i++)
            {
                for (int j = 0; j < Width; j++)
                {
                    
                   
                    r = yuv[3 * (i * Width + j) + 0];
                    g = yuv[3 * (i * Width + j) + 1];
                    b = yuv[3 * (i * Width + j) + 2];
                   
                    
                    yuvList[ycount] = Convert.ToByte(((66 * r + 129 * g + 25 * b + 128) >> 8) + 16);
                    ycount++;
                    // 每 4 个Y,取一个U ,一个V 
                    if (j % 2 == 0 && i % 2 == 0)
                    {
                        yuvList[Height * Width + count] = Convert.ToByte(((-38 * r - 74 * g + 112 * b + 128) >> 8) + 128);
                        yuvList[Height * Width * 5 / 4 + count] = Convert.ToByte(((112 * r - 94 * g - 18 * b + 128) >> 8) + 128);
                        count++;
                    }

                }

            }


            //将二进制流写入文件

            fs = new FileStream("./1.yuv", FileMode.OpenOrCreate);
            BinaryWriter bw = new BinaryWriter(fs);
            bw.Write(yuvList);
            bw.Close();
            fs.Close();

3.验证!本人是使用远端获取流数据解析后能看到我发送的图片来验证的!使用YUV 图片查看器!网上查找了好几个YUV 图片查看器都打不开,不知道什么问题!大家有好用的工具可以提供下!哈哈!

注意:这里我的RGB图片大小是320 * 240,原始图片和YUV图片的尺寸应该保持一致!

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: RGB图像转换YUV可以使用以下公式: Y = .299R + .587G + .114B U = -.147R - .289G + .436B V = .615R - .515G - .100B 其中,R、G、B分别为RGB图像的红、绿、蓝通道值,Y、U、V分别为YUV图像的亮度、色度通道值。 在MATLAB中,可以使用以下代码实现RGB图像到YUV图像的转换: % 读取RGB图像 rgb_img = imread('test.jpg'); % 将RGB图像转换为double类型 rgb_img = im2double(rgb_img); % 计算YUV图像的亮度、色度通道值 yuv_img(:,:,1) = .299*rgb_img(:,:,1) + .587*rgb_img(:,:,2) + .114*rgb_img(:,:,3); yuv_img(:,:,2) = -.147*rgb_img(:,:,1) - .289*rgb_img(:,:,2) + .436*rgb_img(:,:,3); yuv_img(:,:,3) = .615*rgb_img(:,:,1) - .515*rgb_img(:,:,2) - .100*rgb_img(:,:,3); % 显示YUV图像 imshow(yuv_img); 注意,转换后的YUV图像需要使用imshow函数显示,因为MATLAB默认的图像显示格式RGB格式。 ### 回答2: 在MATLAB中,将RGB图像转换YUV格式可以通过以下步骤完成: 1.读取RGB图像 使用imread()函数,读取转换RGB图像。 rgbImage = imread('example.jpg'); 2.将图像转换为双精度类型 为确保转换后的数值精度,将图像转换为double类型。 rgbImage = im2double(rgbImage); 3.颜色空间转换 使用rgb2ycbcr()函数,将RGB图像转换YUV格式yuvImage = rgb2ycbcr(rgbImage); 4.显示转换后的图像 使用imshow()函数,显示转换后的图像。 imshow(yuvImage); 在将RGB图像转换YUV格式时,需要注意以下几点: 1.YUV格式并不是一种存储图像的格式,而是一种颜色空间。 2.YUV格式RGB格式可以相互转换。 3.YUV格式下的Y通道表示图像的亮度信息,U和V通道则表示图像的色度信息。 4.由于YUV格式下只有Y通道与RGB格式下的灰度图像有相似之处,故通常只有Y通道被使用,而U和V通道可以被用于图像编码和压缩。 总的来说,MATLAB将RGB图像转换YUV只需要一行代码即可实现,但需要注意选择合适的转换函数和转换后的通道输出。 ### 回答3: MATLAB是一种功能强大的计算机语言,广泛应用于各种领域,包括数字影像处理。在数字影像处理中,将RGB图像转换YUV格式的图像是一项常见任务。本文将详细介绍MATLAB如何将RGB图像转换YUV图像。 RGB图像是由红、绿、蓝三种颜色组成的,每个像素点都是由这三种颜色的不同组合而成。RGB图像在计算机中使用最为广泛,但它不太适合在压缩和传输过程中使用。相比之下,YUV格式是用于视频压缩和传输的常用格式。在YUV格式中,亮度(Y)和彩色(U和V)是分开的,这使得图像在压缩和传输时可以更加高效和稳定。 现在我们来看一下MATLAB如何将RGB图像转换YUV格式。 首先,我们需要加载一个RGB图像。我们可以使用imread()函数加载一张图片。例如,我们加载名为“test.jpg”的图片: I = imread('test.jpg'); 然后,我们将RGB图像归一化到0和1之间。此步骤是必要的,因为在计算YUV值时,将颜色值除以255可以确保Y、U、V值都在0和1之间。 I = double(I)/255; 接下来,我们需要计算YUV值。这可以通过以下公式完成: Y = 0.299*R + 0.587*G + 0.114*B U = -0.147*R - 0.289*G + 0.436*B V = 0.615*R - 0.515*G - 0.100*B 其中,R、G、B分别是像素的红、绿、蓝三个颜色通道的值。我们可以按照如下代码实现上述公式: Y = 0.299*I(:,:,1) + 0.587*I(:,:,2) + 0.114*I(:,:,3); U = -0.147*I(:,:,1) - 0.289*I(:,:,2) + 0.436*I(:,:,3); V = 0.615*I(:,:,1) - 0.515*I(:,:,2) - 0.100*I(:,:,3); 最后,我们需要将Y、U、V三个通道的像素值组合起来,生成一个YUV图像。 YUV = cat(3, Y, U, V); 至此,我们就成功地将RGB图像转换为了YUV格式的图像。如果需要将YUV图像转换RGB格式,则只需使用以下公式: R = Y + 1.13983*V; G = Y - 0.39465*U - 0.5806*V; B = Y + 2.03211*U; 我们可以使用与上述类似的MATLAB代码来完成此操作。 在MATLAB中,将RGB图像转换YUV图像是一项简单而常见的任务。通过上述步骤,我们可以轻松地将RGB图像转换YUV格式,从而更加高效地进行数据压缩和传输。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

破浪征程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值