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. 先进机器人系统中的关键技术
  2. 递归/回溯:Subsets II求子集(有重复元素)
  3. C#中的{n}运算符
  4. SQL注入之时间盲注 和 报错注入(sql-lab第一关为例)
  5. C语言中的一维数组和二维数组
  6. ybtoj洛谷P4406三角形面积并(扫描线)
  7. Pytorch高阶API示范——DNN二分类模型
  8. 腾讯面试Android必问11题,我说的,不信就来看看
  9. 暑期训练日志----2018.8.3
  10. Java日志组件间关系
  11. PTES标准中的渗透测试阶段(要点)
  12. 高速列车横向17自由度模型
  13. 物联网与互联网有什么区别
  14. Mysql 日期函数详解(now、date_add、datediff )
  15. 智慧城市发力,区块链助力土木建设数据存储
  16. SDN:简述对SDN的认识
  17. Android之获取手机基本信息、内存信息、网路信息、电池信息,等一共18项数据
  18. .net 常见面试问题-2021-08
  19. R-FCN: Object Detection via Region-based Fully Convolutional Networks
  20. Soot -- Soot中的一些语句细节

热门文章

  1. 数据结构和算法 java实现_数据结构与算法——常用数据结构及其Java实现
  2. php 跳转网页常用方法
  3. windows2012 服务器 时钟同步设置
  4. C语言基础知识入门(大全详解)
  5. 如何学素描——新手学素描最容易犯的…
  6. mybatis一对多查询的两种方式
  7. shell脚本的字符处理tr和cut和字符串替换${parameter//pattern/string}
  8. 台式电脑连接宽带远程计算机没反应怎么办,win10电脑错误678远程计算机没反应怎么解决?解决电脑错误678远程计算机没反应方法分享...
  9. AJAX教程美食滤镜,Python爬虫实例——爬取美团美食数据
  10. 浏览器【控制台】的小妙招-dom复制