YUV420知识

对于所有YUV420图像,它们的Y值排列是完全相同的,区别在于UV的排列。

所以YUV420,分为YUV420sp(semi-Planar 半平面)与YUV420p(planar 平面),它们的数据格式在UV排列上是不同的。420p它是先把U或者V存放完后,再存放V或者U,也就是说UV它们是连续的,而420sp是UV交替存放的。

  • I420(YU12)和YV12属于YUV420p格式,将YUV分量分别打包,依次存储。
  • NV12与NV21类似,Y分量和I420一样,U和V交错排列,属于YUV420sp。

YUV 4:2:0采样,每四个Y共用一组UV分量。所以,计算出一个YUV420在内存中存放的大小,就是下面Y,U,V分量的大小总和,即:Y+U+V => width * height * 3/2

Y = width * hight
U = Y / 4
V = Y / 4

图示:1个像素的YUV存储,每个字母代表一位,

I420: YYYYYYYY UUVV  =>  YUV420P
YV12: YYYYYYYY VVUU  =>  YUV420P
NV12: YYYYYYYY UVUV  =>  YUV420SP
NV21: YYYYYYYY VUVU  =>  YUV420SP

在名称中,“YV”表示平面顺序:Y,然后V(然后U)。12指像素深度:对于YV12,每像素12位。NV12中的12也表示每像素12位。

灰白色YUV

下面这段代码生产一个1080x720的YUV文件,格式是YUV420 planar,对于planar的YUV格式,先连续存储所有像素点的Y,紧接着存储所有像素点的U,随后是所有像素点的V。

所以,data的大小是width * height * 3 / 2,先写width * height大小的数据,颜色位0xb4,再写width * height / 2的大小作为uv的数据,这里选择的UV颜色一样,所以一起写了。这样写出来的文件用ubuntu上的YUVView工具查看就是灰白色。

int width = 1080;
int height = 720;
int size = width * height * 3 / 2;
uint8_t *data = (uint8_t *)malloc(size);memset(data, 0xb4, size);
fwrite(data, width * height, 1, fp); // write y datamemset(data + width*height, 0x80, size);
fwrite(data, width*height/2, 1, fp); //write uv data
fclose(fp);

青色YUV

青色的这个文件定义的大小是8x8的文件,因为发现通过YUVView工具,放大8x8的YUV图像后,就可以很清楚的看到YUV分量在图片里面的分布。

下面代码中先申请data内存,然后分别设置不同的值,最后按大小写入。

int width = 8;
int height = 8;
int size = width * height * 3 / 2;
uint8_t *data = (uint8_t *)malloc(size);// set Y to 131
memset(data, 0x83/* 131 */, width*height);
// set U to 156
memset(data + width*height, 0x9c/* 156 */, width*height/4);
// set V to 44
memset(data + width*height + width*height/4, 0x2c/* 44 */, width*height/4);FILE* fp = nullptr;
fp = fopen("/sdcard/h264.yuv", "wb");
// write Y
fwrite(data, width * height, 1, fp);
// write UV
fwrite(data+ width*height, width*height/2, 1, fp);
fclose(fp);

当然,这段代码data已经分别set了YUV分量的值,最后write的时候,一次写入data就可以,分开写fwrite只是为了这个代码上看起来更直观。

生成的文件,通过ubuntu上YUView工具,放大到64倍,就可以看到YUV的分布情况,YUV420四个点有一个UV值:

换成数组的代码

width = 8;
height = 8;
int size = width * height * 3 / 2;
uint8_t *data = (uint8_t *)malloc(size);
memset(data, 0, size);FILE* fp = nullptr;
fp = fopen("/sdcard/h264.yuv", "wb");// set Y to 131
for(int i = 0; i < height; i++) {for(int j = 0; j < width; j++) {data[i*width + j] = 131;}
}// set U to 156
int offset = width * height;
for(int i = 0; i < height/4; i++) {for(int j = 0; j < width; j++) {data[offset + i*width + j] = 156;}
}// set V to 45
offset = width*height + width*height/4;
for(int i = 0; i < height/4; i++) {for(int j = 0; j < width; j++) {data[offset + i*width + j] = 45;}
}fwrite(data, width * height, 1, fp);
//write UV
fwrite(data+ width*height, width*height/2, 1, fp);fclose(fp);

YUView查看,和前面的V值不一样:

前面代码中的颜色表参考

标称范围 白色 黄色 青色 绿色 红色 蓝色 黑色
Y 16~235 180 162 131 112 65 35 16
Cb 16~240 128 44 156 72 100 212 128
Cr 16~240 128 142 44 58 212 114 128

C代码生成YUV420 planar格式文件相关推荐

  1. YUV422 YUV420 Planar \ Semi-Planar \ Interleaved格式详解

    很多人对YUV数据格式不清楚,以至于在做视频的时候出现了一些不可预知的错误(比如说图像带有点.颜色不对等).今晚是周末放假,我就抽点时间来给大家介绍一下. 提示: 读下面的文字时,希望大家结合图片看, ...

  2. YUV420 Planar 和YUV420 Semi-Planar详解

    参考:https://blog.csdn.net/qq_25005909/article/details/79480935 前言 YUV 格式通常有两大类:打包(packed)格式和平面(planar ...

  3. YUV422 YUV420 Planar Semi-Planar详解

    前言 YUV 格式通常有两大类:打包(packed)格式和平面(planar)格式.前者将 YUV 分量存放在同一个数组中, 通常是几个相邻的像素组成一个宏像素(macro-pixel);而后者使用三 ...

  4. YUV422 YUV420 Planar \ Semi-Planar \ Interleaved

    关于yuv 格式 YUV 格式通常有两大类:打包(packed)格式和平面(planar)格式.前者将 YUV 分量存放在同一个数组中, 通常是几个相邻的像素组成一个宏像素(macro-pixel); ...

  5. 文件流能转换格式吗_amr转换mp3格式文件

    MP3是非常标准的音频数字编码格式.区别于其他格式的优势在于,它可以在不降低音质的前提下,大幅的降低文件的大小.因此MP3格式应用范围极广,我们日常生活中用到的歌曲格式也多为MP3.今天要给大家说的是 ...

  6. fastq质量值_fastq格式文件处理大全(四)

    计算机的角度来说,生物的序列属于一种字符串,也是一种文本,因此生物信息分析属于文本处理范畴.文本存储为固定格式文件,生物信息的工作就是各种文本文件之间格式的转换,例如通过序列拼接将fastq转换为fa ...

  7. Python使用scipy包将稀疏矩阵保存为Mtx格式和npz格式文件实战

    Python使用scipy包将稀疏矩阵保存为Mtx格式和npz格式文件实战 目录 Python将稀疏矩阵保存为Mtx格式和npz格式文件实战 #导入包和仿真数据

  8. .fa .fna和.fasta是同一种格式文件吗?

    .fa .fna和.fasta是同一种格式文件吗? fasta与fastq的区别: fasta格式(格式缩写为fa)是一种存储核酸或氨基酸序列的文本格式 ,允许在序列前定义名称和编写注释. 已成为生物 ...

  9. fasta和fastq格式文件的shell小练习 http://www.bio-info-trainee.com/3575.html

    其次完成生物信息学数据格式的习题(blast/blat/fa-fq/sam-bam/vcf/bed/gtf-gff),收集这些格式的说明书. fasta和fastq格式文件的shell小练习 http ...

最新文章

  1. Numpy的基本操作
  2. 10 个神奇的网站显示超强的 HTML5 技术
  3. C语言程序设计的常用算法
  4. 移动计算机怎么开机密码,win7忘记开机密码解决办法
  5. php中::双冒号有什么作用
  6. boolean怎么用_游戏里的NPC是怎么“思考”的?深入分析来了!
  7. 海量ICLR论文点评公开,用这几个工具可以读得更轻松
  8. 关于Oracle用sqlldr导入限制值长度大于255问题解决方法
  9. java swnig 太极,iOS 13 系统那些好玩的桌面小组件
  10. Linux编译Ralink无线网卡驱动
  11. “Kindle App中文字体9MB下载失败”解决办法
  12. Python第九章 文件系统
  13. 5G NR的新特征—超低时延
  14. 第一章 富爸爸,穷爸爸
  15. 节假日读取接口_2018年节假日API接口,直接计算好的
  16. OA系统,满足各行业办公所需的管理软件
  17. matlab昆虫繁殖实验,MATLAB--实验四 昆虫繁殖问题.ppt
  18. 安装配置Android Studio集成开发环境
  19. 数据挖掘中的数据预处理方法总结
  20. P3354 [IOI2005]Riv 河流

热门文章

  1. git切换分支保存修改的代码的方法
  2. c语言坐标如何判定碰撞,狂野飙车9碰撞怎么判定?碰撞系统玩法设定详细介绍...
  3. 攻防世界-密码题目-shanghai
  4. 第八章:数据结构四兄弟——列表(上),痴月熊学python
  5. 双线性池化_卷积神经网络中的各种池化操作
  6. angular使用@viewChild父组件获取子组件的数据和方法
  7. skr!skr!能视频通话的360儿童手表,原来是这样实现的!
  8. SpringBoot+MyBatis+Vue+ElementUI项目实战-人事管理系统(免费开源)
  9. Facebook 送你个穿搭师,建议十一出行前查收
  10. 52 通过键值对访问字典