图像和流媒体 -- 详解YUV数据格式

如需转载请注明出处:https://blog.csdn.net/qq_29350001/article/details/78283369

我们在讲 FFmpeg 系列的时候,有提到 YUV 的。其中包括YUV播放器、简单的YUV格式介绍。

参看:FFmpeg再学习 -- 视音频基础知识

接下来详细研究一下:

参看:YUV -- 维基百科

参看:图文详解YUV420数据格式

一、YUV简介

YUV,是一种颜色编码方法。常使用在各个影像处理元件中。 YUV在对照片或影片编码时,考虑到人类的感知能力,允许降低色度的带宽。
YUV是编译true-color颜色空间(color space)的种类,Y'UV, YUV, YCbCr,YPbPr等专有名词都可以称为YUV,彼此有重叠。“Y”表示明亮度(Luminance、Luma),“U”和“V”则是色度、浓度(Chrominance、Chroma),Y′UV, YUV, YCbCr, YPbPr所指涉的范围,常有混淆或重叠的情况。从历史的演变来说,其中YUV和Y'UV通常用来编码电视的模拟信号,而YCbCr则是用来描述数位的影像信号,适合影片与图片压缩以及传输,例如MPEG、JPEG。 但在现今,YUV通常已经在电脑系统上广泛使用。
Y'代表明亮度(luma; brightness)而U与V储存色度(色讯; chrominance; color)部分; 亮度(luminance)记作Y,而Y'的prime符号记作伽玛校正。
YUV Formats分成两个格式:
紧缩格式(packed formats):将Y、U、V值储存成Macro Pixels阵列,和RGB的存放方式类似。
平面格式(planar formats):将Y、U、V的三个分量分别存放在不同的矩阵中。

紧缩格式(packed format)中的YUV是混合在一起的,对于YUV4:4:4格式而言,用紧缩格式很合适的,因此就有了UYVY、YUYV等。

平面格式(planar formats)是指每Y分量,U分量和V分量都是以独立的平面组织的,也就是说所有的U分量必须在Y分量后面,而V分量在所有的U分量后面,此一格式适用于采样(subsample)。平面格式(planar format)有I420(4:2:0)、YV12、IYUV等。

二、历史

Y'UV的发明是由于彩色电视与黑白电视的过渡时期[1]。黑白视讯只有Y(Luma,Luminance)视讯,也就是灰阶值。到了彩色电视规格的制定,是以YUV/YIQ的格式来处理彩色电视图像,把UV视作表示彩度的C(Chrominance或Chroma),如果忽略C信号,那么剩下的Y(Luma)信号就跟之前的黑白电视信号相同,这样一来便解决彩色电视机与黑白电视机的相容问题。Y'UV最大的优点在于只需占用极少的带宽。
因为UV分别代表不同颜色信号,所以直接使用R与B信号表示色度的UV。 也就是说UV信号告诉了电视要偏移某象素的的颜色,而不改变其亮度。 或者UV信号告诉了显示器使得某个颜色亮度依某个基准偏移。 UV的值越高,代表该像素会有更饱和的颜色。
彩色图像记录的格式,常见的有RGB、YUV、CMYK等。彩色电视最早的构想是使用RGB三原色来同时传输。这种设计方式是原来黑白带宽的3倍,在当时并不是很好的设计。RGB诉求于人眼对色彩的感应,YUV则着重于视觉对于亮度的敏感程度,Y代表的是亮度,UV代表的是彩度(因此黑白电影可省略UV,相近于RGB),分别用Cr和Cb来表示,因此YUV的记录通常以Y:UV的格式呈现。

三、常用的YUV格式

为节省带宽起见,大多数YUV格式平均使用的每像素位数都少于24位元。主要的抽样(subsample)格式有YCbCr 4:2:0、YCbCr 4:2:2、YCbCr 4:1:1和YCbCr 4:4:4。YUV的表示法称为A:B:C表示法:
4:4:4表示完全取样。
4:2:2表示2:1的水平取样,垂直完全采样。
4:2:0表示2:1的水平取样,垂直2:1采样。
4:1:1表示4:1的水平取样,垂直完全采样。
最常用Y:UV记录的比重通常1:1或2:1,DVD-Video是以YUV 4:2:0的方式记录,也就是我们俗称的I420,YUV4:2:0并不是说只有U(即Cb), V(即Cr)一定为0,而是指U:V互相援引,时见时隐,也就是说对于每一个行,只有一个U或者V分量,如果一行是4:2:0的话,下一行就是4:0:2,再下一行是4:2:0...以此类推。至于其他常见的YUV格式有YUY2、YUYV、YVYU、UYVY、AYUV、Y41P、Y411、Y211、IF09、IYUV、YV12、YVU9、YUV411、YUV420等。

 

用三个图来直观地表示采集的方式吧,以黑点表示采样该像素点的Y分量,以空心圆圈表示采用该像素点的UV分量。

先记住下面这段话,以后提取每个像素的YUV分量会用到。
YUV 4:4:4采样,每一个Y对应一组UV分量。
YUV 4:2:2采样,每两个Y共用一组UV分量。 
YUV 4:2:0采样,每四个Y共用一组UV分量。 

四、存储方式

下面我用图的形式给出常见的YUV码流的存储方式,并在存储方式后面附有取样每个像素点的YUV数据的方法,其中,Cb、Cr的含义等同于U、V。

(1) YUVY 格式 (属于YUV422)

YUYV为YUV422采样的存储格式中的一种,相邻的两个Y共用其相邻的两个Cb、Cr,分析,对于像素点Y'00、Y'01 而言,其Cb、Cr的值均为 Cb00、Cr00,其他的像素点的YUV取值依次类推。 

(2) UYVY 格式 (属于YUV422)

UYVY格式也是YUV422采样的存储格式中的一种,只不过与YUYV不同的是UV的排列顺序不一样而已,还原其每个像素点的YUV值的方法与上面一样。

(3) YUV422P(属于YUV422)

YUV422P也属于YUV422的一种,它是一种Plane模式,即平面模式,并不是将YUV数据交错存储,而是先存放所有的Y分量,然后存储所有的U(Cb)分量,最后存储所有的V(Cr)分量,如上图所示。其每一个像素点的YUV值提取方法也是遵循YUV422格式的最基本提取方法,即两个Y共用一个UV。比如,对于像素点Y'00、Y'01 而言,其Cb、Cr的值均为 Cb00、Cr00。

(4)YV12,YU12格式(属于YUV420)

YU12和YV12属于YUV420格式,也是一种Plane模式,将Y、U、V分量分别打包,依次存储。其每一个像素点的YUV数据提取遵循YUV420格式的提取方式,即4个Y分量共用一组UV。注意,上图中,Y'00、Y'01、Y'10、Y'11共用Cr00、Cb00,其他依次类推。

(5)NV12、NV21(属于YUV420)

NV12和NV21属于YUV420格式,是一种two-plane模式,即Y和UV分为两个Plane,但是UV(CbCr)为交错存储,而不是分为三个plane。其提取方式与上一种类似,即Y'00、Y'01、Y'10、Y'11共用Cr00、Cb00

(6)了解更多

想了解更多类型的存储方式,参看:YUV Formats

中文的有人翻译了,参看:V4L2文档翻译(十)

 

五、YUV与RGB的转换公式

参看:YUV -- 维基百科

这部分我没看懂...   

六、推荐一个工具

参看:Image Analyzer

参看:GSG:Debugging projects

参看:软件操作演示

文章最后,是有视频都哦!!可以下载下来看看。

 

 

七、RGB 介绍

既然都提到RGB了,就简单讲一下吧。

参看:三原色光模式 -- 维基百科

三原色光模式(RGB color model),又称RGB颜色模型或红绿蓝颜色模型,是一种加色模型,将红(Red)、绿(Green)、蓝(Blue)三原色的色光以不同的比例相加,以产生多种多样的色光。(且三原色的红绿蓝不可能用其他单色光合成)

三原色光的相加:红光加绿光为黄光,黄光加蓝光为白光

再有一个是  RGB颜色查询对照表  

 

八、像素

最后,我要讲一下像素,上面提到很多次了。

参看:分辨率和像素是什么关系? -- 知乎

像素即px,是画面中最小的点(单位色块)。像素的大小是没有固定长度值的,不同设备上1个单位像素色块的大小是不一样的。
分辨率=画面水平方向的像素值 * 画面垂直方向的像素值。分辨率可以分为两方面:屏幕分辨率和图像分辨率。

1. 屏幕分辨率:     

例如,屏幕分辨率是1024×768,也就是说设备屏幕的水平方向上有1024个像素点,垂直方向上有768个像素点。像素的大小是没有固定长度的,不同设备上一个单位像素色块的大小是不一样的。    例如,尺寸面积大小相同的两块屏幕,分辨率大小可以是不一样的,分辨率高的屏幕上面像素点(色块)就多,所以屏幕内可以展示的画面就更细致,单个色块面积更小。而分辨率低的屏幕上像素点(色块)更少,单个像素面积更大,可以显示的画面就没那么细致。

2. 图像分辨率:    

例如,一张图片分辨率是500x200,也就是说这张图片在屏幕上按1:1放大时,水平方向有500个像素点(色块),垂直方向有200个像素点(色块)。    在同一台设备上,图片分辨率越高,这张图片1:1放大时,图片面积越大;图片分辨率越低,这张图片1:1缩放时,图片面积越小。(可以理解为图片的像素点和屏幕的像素点是一个一个对应的)。    但是,在屏幕上把图片超过100%放大时,为什么图片上像素色块也变的越大,其实是设备通过算法对图像进行了像素补足,我们把图片放的很大后看到的一块一块的方格子,虽然理解为一个图像像素,但是其实是已经补充了很多个屏幕像素;同理,把图片小于100%缩小时,也是通过算法将图片像素进行减少。     

最后,虽然不同设备上像素块大小会不一样,但是同一台硬件设备上的屏幕分辨率、像素块大小是不会变的。PC电脑上之所以可以调整屏幕分辨率,其实也是通过算法转换了。

 

举个例子吧,我用的华为P8手机(是该换了...),看看其参数。

这里就有摄像头参数介绍了,后置摄像头 1300万像素。或者说 vivo X9前置2000万柔光双摄,这个广告熟不熟悉。

1300万像素啥意思呢?

打开手机相机设置,查看分辨率,你可以看到有如下几个选项。

其中图片大小最大的 13M 4160x3120(4:3) 即摄像头最大像素

4160x3120 = 12979200 = 1300 万像素

如需转载请注明出处:https://blog.csdn.net/qq_29350001/article/details/78283369

 

发布了373 篇原创文章 · 获赞 2023 · 访问量 262万+
展开阅读全文

HM代码在深度学习应用调试过程中出现如下的问题,有人遇到过吗??

08-08

``` Tensor("Conv2D:0", shape=(?, 1, 1, 1), dtype=float32) Tensor("ResizeNearestNeighbor:0", shape=(?, 16, 16, 1), dtype=float32) Tensor("LeakyRelu:0", shape=(?, 4, 4, 16), dtype=float32) Tensor("LeakyRelu_1:0", shape=(?, 2, 2, 24), dtype=float32) Tensor("LeakyRelu_2:0", shape=(?, 1, 1, 32), dtype=float32) Tensor("Conv2D_4:0", shape=(?, 2, 2, 1), dtype=float32) Tensor("ResizeNearestNeighbor_1:0", shape=(?, 32, 32, 1), dtype=float32) Tensor("LeakyRelu_3:0", shape=(?, 8, 8, 16), dtype=float32) Tensor("LeakyRelu_4:0", shape=(?, 4, 4, 24), dtype=float32) Tensor("LeakyRelu_5:0", shape=(?, 2, 2, 32), dtype=float32) Tensor("Conv2D_8:0", shape=(?, 4, 4, 1), dtype=float32) Tensor("ResizeNearestNeighbor_2:0", shape=(?, 64, 64, 1), dtype=float32) Tensor("LeakyRelu_6:0", shape=(?, 16, 16, 16), dtype=float32) Tensor("LeakyRelu_7:0", shape=(?, 8, 8, 24), dtype=float32) Tensor("LeakyRelu_8:0", shape=(?, 4, 4, 32), dtype=float32) Tensor("concat:0", shape=(?, 2688), dtype=float32) Tensor("cond/Merge:0", shape=(?, 64), dtype=float32) Tensor("cond_1/Merge:0", shape=(?, 48), dtype=float32) Tensor("cond_2/Merge:0", shape=(?, 1), dtype=float32) Tensor("cond_3/Merge:0", shape=(?, 128), dtype=float32) Tensor("cond_4/Merge:0", shape=(?, 96), dtype=float32) Tensor("cond_5/Merge:0", shape=(?, 4), dtype=float32) Tensor("cond_7/Merge:0", shape=(?, 256), dtype=float32) Tensor("cond_8/Merge:0", shape=(?, 192), dtype=float32) Tensor("cond_9/Merge:0", shape=(?, 16), dtype=float32) D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 1/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 302/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 303/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 304/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 305/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 306/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 307/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 308/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 309/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 310/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 311/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 312/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 313/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 314/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 315/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 316/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 317/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 318/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 319/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 320/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 321/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 322/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 323/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 324/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 325/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 326/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 327/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 328/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 329/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 330/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 331/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 332/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 333/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 334/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 335/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 336/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 337/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 338/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 339/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 340/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 341/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 342/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 343/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 344/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 345/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 346/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 347/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 348/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 349/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 350/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 351/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 352/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 353/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 354/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 355/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 356/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 357/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 358/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 359/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 360/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 361/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 362/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 363/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 364/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 365/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 366/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 367/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 368/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 369/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 370/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 371/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 372/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 373/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 374/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 375/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 376/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 377/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 378/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 379/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 380/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 381/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 382/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 383/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 384/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 385/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 386/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 387/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 388/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 389/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 390/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 391/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 392/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 393/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 394/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 395/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 396/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 397/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 398/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 399/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 400/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 401/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 402/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 403/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 404/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 405/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 406/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 407/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 408/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 409/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 410/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 411/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 412/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 413/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 414/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 415/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 416/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 417/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 418/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 419/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 420/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 421/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 422/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 423/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 424/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 425/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 426/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 427/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 428/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 429/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 430/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 431/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 432/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 433/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 434/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 435/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 436/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 437/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 438/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 439/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 440/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 441/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 442/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 443/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 444/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 445/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 446/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 447/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 448/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 449/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 450/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 451/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 452/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 453/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 454/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 455/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 456/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 457/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 458/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 459/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 460/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 461/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 462/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 463/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 464/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 465/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 466/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 467/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 468/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 469/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 470/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 471/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 472/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 473/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 474/501 416x240 D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv frame 475/501 416x240 -------- Predicting Time: 15.445 sec. -------- HM software: Encoder Version [16.5] (including RExt)[Windows][VS 1900][64 bit] python video_to_cu_depth.py D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv 416 240 32 Input File : D:\HM\HM-16.5_Test_AI\bin\vc10\x64\Release\BasketballPass_416x240_50.yuv Bitstream File : str.bin Reconstruction File : rec.yuv Real Format : 416x240 50Hz Internal Format : 416x240 50Hz Sequence PSNR output : Linear average only Sequence MSE output : Disabled Frame MSE output : Disabled Cabac-zero-word-padding : Enabled Frame/Field : Frame based coding Frame index : 0 - 49 (50 frames) Profile : main CU size / depth / total-depth : 64 / 4 / 4 RQT trans. size (min / max) : 4 / 32 Max RQT depth inter : 3 Max RQT depth intra : 3 Min PCM size : 8 Motion search range : 64 Intra period : 1 Decoding refresh type : 0 QP : 32.00 Max dQP signaling depth : 0 Cb QP Offset : 0 Cr QP Offset : 0 QP adaptation : 0 (range=0) GOP size : 1 Input bit depth : (Y:8, C:8) MSB-extended bit depth : (Y:8, C:8) Internal bit depth : (Y:8, C:8) PCM sample bit depth : (Y:8, C:8) Intra reference smoothing : Enabled diff_cu_chroma_qp_offset_depth : -1 extended_precision_processing_flag : Disabled implicit_rdpcm_enabled_flag : Disabled explicit_rdpcm_enabled_flag : Disabled transform_skip_rotation_enabled_flag : Disabled transform_skip_context_enabled_flag : Disabled cross_component_prediction_enabled_flag: Disabled high_precision_offsets_enabled_flag : Disabled persistent_rice_adaptation_enabled_flag: Disabled cabac_bypass_alignment_enabled_flag : Disabled log2_sao_offset_scale_luma : 0 log2_sao_offset_scale_chroma : 0 Cost function: : Lossy coding (default) RateControl : 0 Max Num Merge Candidates : 5 TOOL CFG: IBD:0 HAD:1 RDQ:1 RDQTS:1 RDpenalty:0 SQP:0 ASR:0 FEN:1 ECU:0 FDM:1 CFM:0 ESD:0 RQT:1 TransformSkip:1 TransformSkipFast:1 TransformSkipLog2MaxSize:2 Slice: M=0 SliceSegment: M=0 CIP:0 SAO:1 PCM:0 TransQuantBypassEnabled:0 WPP:0 WPB:0 PME:2 WaveFrontSynchro:0 WaveFrontSubstreams:1 ScalingList:0 TMVPMode:1 AQpS:0 SignBitHidingFlag:1 RecalQP:0 Non-environment-variable-controlled macros set as follows: RExt__DECODER_DEBUG_BIT_STATISTICS = 0 RExt__HIGH_BIT_DEPTH_SUPPORT = 0 RExt__HIGH_PRECISION_FORWARD_TRANSFORM = 0 O0043_BEST_EFFORT_DECODING = 0 Input ChromaFormatIDC = 4:2:0 Output (internal) ChromaFormatIDC = 4:2:0 ``` 问答

我在网上找了个bmp转YUV的程序进行修改,但读不出数据,不知什么问题,有谁懂的请帮忙看下,谢谢了

04-28

#include <stdio.h> #include <stdlib.h> #include "bmp2rgb.h" u_int8_t BMP2RGB(BITMAPFILEHEADER file_header,BITMAPINFOHEADER info_header, FILE* bmpFile, u_int8_t* rgbBuf);//24bit RGB u_int8_t RGB24ToYUV420(int Width,int Height,u_int8_t* rgbBuf,u_int8_t*YuvBuffer); #define max(a,b) (((a)>(b))?(a):(b)) #define min(a,b) (((a) < (b)) ? (a) : (b)) int main(int argc, char** argv) { //设置命令行参数 argv[1]= "boot_logo.bmp"; argv[2]="boot_logo.yuv"; //相当于设置文件名 char* bmpFileName = argv[1]; char* yuvFileName = argv[2]; //打开文件 FILE* bmpFile = fopen(bmpFileName, "rb"); if (bmpFile == NULL) { printf(" Open the BMP file.\n"); exit(1); } else { printf("The BMP file is %s\n", bmpFileName); } FILE* yuvFile = fopen(yuvFileName, "wb"); if (yuvFile == NULL) { printf("Cannot open the YUV file.\n"); exit(1); } else { printf("The YUV file is %s\n", yuvFileName); } //读取BMP文件头,信息头,读取错误时的处理代码 BITMAPFILEHEADER file_header; BITMAPINFOHEADER info_header; if (fread(&file_header, sizeof(BITMAPFILEHEADER), 1, bmpFile) != 1) if (file_header.bfType != 0x4D42) { printf("Not BMP file.\n"); exit(1); } if (fread(&info_header, sizeof(BITMAPINFOHEADER), 1, bmpFile) != 1) { printf("read info header error!"); exit(1); }//结束读取BMP文件头 //读取图像尺寸 int width = info_header.biWidth; int height = info_header.biHeight; //开辟缓冲区 buf u_int8_t* yBuf = (u_int8_t*)malloc(height*width); u_int8_t* uBuf = (u_int8_t*)malloc(height*width / 4); u_int8_t* vBuf = (u_int8_t*)malloc(height*width / 4); u_int8_t* rgbBuf = (u_int8_t*)malloc(height*width * 3); u_int8_t*YuvBuffer =(u_int8_t*)malloc(height*width * 5); if (yBuf == NULL || uBuf == NULL || vBuf == NULL || rgbBuf == NULL || YuvBuffer==NULL) { printf("Not enough memory\n"); exit(1); } //BMP与RGB的转换,得到RGB数据 if (BMP2RGB(file_header, info_header, bmpFile, rgbBuf)) { printf("BMP2RGB error\n"); exit(1); } //RGB与YUV的转换,得到YUV数据 // int flip = 0; /*读取到的图像数据是倒序存放的,flip=0保证了RGB2YUV可以正确地对其转换*/ /* if (RGB2YUV(width, height, rgbBuf, yBuf, uBuf, vBuf, flip)) { printf("RGB2YUV error\n"); exit(1); } //将yuv按顺序写入yuvfile文件 fwrite(yBuf, 1, width * height, yuvFile); fwrite(uBuf, 1, (width * height) / 4, yuvFile); fwrite(vBuf, 1, (width * height) / 4, yuvFile);*/ if( RGB24ToYUV420( width, height, rgbBuf,YuvBuffer)) { printf("RGB24ToYUV420 error\n"); exit(1); } int len=0; len= fwrite(YuvBuffer, 1,sizeof(YuvBuffer), yuvFile); printf("len ==%d byte\n",len); //打印宽高,方便yuv观看程序打开 printf("width is %d", width); printf("\n"); printf("height is %d", height); printf("\n"); //清理内存 free(rgbBuf); free(YuvBuffer); free(yBuf); free(uBuf); free(vBuf); fclose(bmpFile); fclose(yuvFile); return 0; } u_int8_t BMP2RGB(BITMAPFILEHEADER file_header,BITMAPINFOHEADER info_header, FILE* bmpFile, u_int8_t* rgbBuf) { BITMAPFILEHEADER file_h=file_header; BITMAPINFOHEADER info_h=info_header; FILE* pFile =bmpFile; int w=0,h=0; //确定像素的实际点阵数 w = (info_h.biWidth*info_h.biBitCount + 31) / 32 * 4;//w为实际一行的字节数 h = info_h.biHeight;//h为列数 // printf("w==%d,h==%d\n",w,h); //开辟实际字节数量的缓冲区,读数据,一次读取一个字节 u_int8_t* dataBuf = (u_int8_t*)malloc(w*h); /*使用文件头的字节偏移属性bfOffBits 直接把文件指针定位到像素值数据的起始 */ fseek(pFile, file_h.bfOffBits, 0); fread(dataBuf, 1, w*h, pFile); unsigned char* data = dataBuf; u_int8_t* rgb = rgbBuf; //开始写入rgb int i, j; for (j = 0; j < h; j++)//j控制行循环 { for (i = 0; i < w; i += 3)//i控制列循环 { *rgb = data[i + w*j];//B *(rgb + 1) = data[i + w*j + 1];//G *(rgb + 2) = data[i + w*j + 2];//R rgb += 3; } } //释放内存 free(dataBuf); return 0; } /***************************************************************************************************************/ u_int8_t RGB24ToYUV420(int Width,int Height,u_int8_t* rgbBuf,u_int8_t*YuvBuffer) { u_int8_t* yuvBuf=YuvBuffer;//YUV空间 int nWidth=Width; int nHeight=Height; /////////////////////下面转换算法是网上查到的 int i, j; u_int8_t*bufY = yuvBuf; u_int8_t*bufU = yuvBuf + nWidth * nHeight; u_int8_t*bufV = bufU + (nWidth* nHeight* 1/4); u_int8_t*Y=bufY; u_int8_t*U=bufU; u_int8_t*V=bufV; u_int8_t*bufRGB; unsigned char y, u, v, r, g, b; if (NULL==rgbBuf) { printf("NULL==rgbBuf\n"); return 1 ; } for (j = 0; j<nHeight;j++) { bufRGB = rgbBuf + nWidth * (nHeight - 1-j) * 3 ; for (i = 0;i<nWidth;i++) { int pos = nWidth * i + j; r= *(bufRGB++); g = *(bufRGB++); b = *(bufRGB++); y =(unsigned char)(( 66 * r + 129 * g + 25 * b + 128) >>8) + 16;//16 v = (unsigned char)((-38 * r - 74 * g + 112 * b + 128) >>8) +128 ; //128 u = (unsigned char)((112 * r - 94 * g - 18 * b + 128) >> 8) + 128 ; *(bufY++)=max(0,min(y, 255 )); if (j%2==0&&i%2 ==0) { if (u>255) { u=255; } if (u<0) { u = 0; } *(bufU++) =u; //存u分量 } else { //存v分量 if (i%2==0) { if (v>255) { v = 255; } if (v<0) { v = 0; } *(bufV++) =v; } } } } return 0; } ``` #include <stdio.h> #include "sys/types.h" #include <stdlib.h> typedef unsigned long DWORD;//32bit typedef unsigned short WORD;//16bit typedef unsigned long LONG; //32bit typedef struct tagBITMAPFILEHEADER { //0x00~0x01,说明文件的类型 WORD bfType; //0x02~0x05,说明文件的大小,用字节B为单位 DWORD bfSize; //0x06~0x07,保留,设置为0 WORD bfReserved1; //0x08~0x09,保留,设置为0 WORD bfReserved2; //0x0a~0x0d,说明从BITMAP_FILE_HEADER结构开始到实际的图像数据之间的字节偏移量 DWORD bfOffBits; } BITMAPFILEHEADER; typedef struct tagBITMAPINFOHEADER { //0x0e~0x11,说明当前结构体所需字节数 DWORD biSize; //0x12~0x15,以像素为单位说明图像的宽度 LONG biWidth; //0x16~0x19,以像素为单位说明图像的高度 LONG biHeight; //0x1a~0x1b,说明位面数,必须为1 WORD biPlanes; //0x1c~0x1d,说明图像的位深度 WORD biBitCount; //0x1e~0x21,说明图像是否压缩及压缩类型 DWORD biCompression; //0x22~0x25,以字节为单位说明图像大小,必须是4的整数倍 DWORD biSizeImage; //0x26~0x29,目标设备的水平分辨率,像素/米 LONG biXPelsPerMeter; //0x2a~0x2d,目标设备的垂直分辨率,像素/米 LONG biYPelsPerMeter; //0x2e~0x31,说明图像实际用到的颜色数,如果为0,则颜色数为2的biBitCount次方 DWORD biClrUsed; //0x32~0x35,说明对图像显示有重要影响的颜色索引的数目,如果是0,表示都重要。 DWORD biClrImportant; } BITMAPINFOHEADER; ``` 运行环境linux,bmp图片24位 运行结果: The BMP file is boot_logo.bmp The YUV file is boot_logo.yuv len ==8 byte width is 185729024 height is 0 问答

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 程序猿惹谁了 设计师: 上身试试

分享到微信朋友圈

×

扫一扫,手机浏览