非交织YUV格式转换
本文为自己写的从非交织yuv420转换出yuv444,yuv422h,yuv422v和手动裁剪422h,422v图片的代码
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h> #define WIDTH 1280
#define HEIGHT 720 #define NEW_WIDTH 1270
#define NEW_HEIGHT 700 #define CONVERT_BEGIN(y, u, v, fd_in, file_in, fd_out, file_out, y_size, uv_size, read_uv_size) \
do { \
y = malloc(y_size); \
u = malloc(uv_size); \
v = malloc(uv_size); \
fd_in = open(file_in, O_RDONLY); \
fd_out = open(file_out, O_WRONLY|O_CREAT|O_TRUNC, ); \
read(fd_in, y, y_size); \
read(fd_in, u, read_uv_size); \
read(fd_in, v, read_uv_size); \
} while() #define CONVERT_END(fd_in, fd_out, y, u, v) \
do { \
close(fd_in); \
close(fd_out); \
free(y); \
free(u); \
free(v); \
} while() static int yuv420_2_yuv444(char *file_in, char *file_out, int buf_size)
{
int fd_in, fd_out, i, j;
char *y_addr, *u_addr, *v_addr; CONVERT_BEGIN(y_addr, u_addr, v_addr, fd_in, file_in, fd_out, file_out, buf_size, buf_size/, buf_size/); write(fd_out, y_addr, buf_size);
for (j = ; j < HEIGHT/; j++) {
for (i = ; i < WIDTH/; i++) {
write(fd_out, &u_addr[j*(WIDTH/) + i], );
write(fd_out, &u_addr[j*(WIDTH/) + i], );
}
for (i = ; i < WIDTH/; i++) {
write(fd_out, &u_addr[j*(WIDTH/) + i], );
write(fd_out, &u_addr[j*(WIDTH/) + i], );
}
} for (j = ; j < HEIGHT/; j++) {
for (i = ; i < WIDTH/; i++) {
write(fd_out, &v_addr[j*(WIDTH/) + i], );
write(fd_out, &v_addr[j*(WIDTH/) + i], );
}
for (i = ; i < WIDTH/; i++) {
write(fd_out, &v_addr[j*(WIDTH/) + i], );
write(fd_out, &v_addr[j*(WIDTH/) + i], );
}
}
CONVERT_END(fd_in, fd_out, y_addr, u_addr, v_addr);
return ;
} static int yuv420_2_yuv422h(char *file_in, char *file_out, int buf_size)
{
int fd_in, fd_out, i, j;
char *y_addr, *u_addr, *v_addr; CONVERT_BEGIN(y_addr, u_addr, v_addr, fd_in, file_in, fd_out, file_out, buf_size, buf_size/, buf_size/); write(fd_out, y_addr, buf_size);
for (j = ; j < HEIGHT/; j++) {
for (i = ; i < WIDTH/; i++) {
write(fd_out, &u_addr[j*(WIDTH/) + i], );
}
for (i = ; i < WIDTH/; i++) {
write(fd_out, &u_addr[j*(WIDTH/) + i], );
}
} for (j = ; j < HEIGHT/; j++) {
for (i = ; i < WIDTH/; i++) {
write(fd_out, &v_addr[j*(WIDTH/) + i], );
}
for (i = ; i < WIDTH/; i++) {
write(fd_out, &v_addr[j*(WIDTH/) + i], );
}
}
CONVERT_END(fd_in, fd_out, y_addr, u_addr, v_addr);
return ;
} static int yuv420_2_yuv422v(char *file_in, char *file_out, int buf_size)
{
int fd_in, fd_out, i, j;
char *y_addr, *u_addr, *v_addr; CONVERT_BEGIN(y_addr, u_addr, v_addr, fd_in, file_in, fd_out, file_out, buf_size, buf_size/, buf_size/); write(fd_out, y_addr, buf_size);
for (j = ; j < HEIGHT/; j++) {
for (i = ; i < WIDTH/; i++) {
write(fd_out, &u_addr[j*(WIDTH/) + i], );
write(fd_out, &u_addr[j*(WIDTH/) + i], );
}
} for (j = ; j < HEIGHT/; j++) {
for (i = ; i < WIDTH/; i++) {
write(fd_out, &v_addr[j*(WIDTH/) + i], );
write(fd_out, &v_addr[j*(WIDTH/) + i], );
}
}
CONVERT_END(fd_in, fd_out, y_addr, u_addr, v_addr);
return ;
} static int yuv422h_resize(char *file_in, int src_size, int w, int h)
{
int fd_in, fd_out, j;
int buf_size = w * h;
char *y_addr, *u_addr, *v_addr;
char file_out[];
sprintf(file_out, "422h_%d_%d.yuv", NEW_WIDTH, NEW_HEIGHT); CONVERT_BEGIN(y_addr, u_addr, v_addr, fd_in, file_in, fd_out, file_out, src_size, src_size/, src_size/); /* y: WIDTH*HEIGHT => w*h*/
for (j = ; j < h; j++)
write(fd_out, y_addr + j*WIDTH, w); /* u: WIDTH/2 *HEIGHT => w/2*h*/
for (j = ; j < h; j++)
write(fd_out, u_addr + j*WIDTH/, w/); /* v: WIDTH/2 *HEIGHT => w/2*h*/
for (j = ; j < h; j++)
write(fd_out, v_addr + j*WIDTH/, w/); CONVERT_END(fd_in, fd_out, y_addr, u_addr, v_addr);
return ;
} static int yuv422v_resize(char *file_in, int src_size, int w, int h)
{
int fd_in, fd_out, j;
int buf_size = w * h;
char *y_addr, *u_addr, *v_addr;
char file_out[];
sprintf(file_out, "422v_%d_%d.yuv", NEW_WIDTH, NEW_HEIGHT); CONVERT_BEGIN(y_addr, u_addr, v_addr, fd_in, file_in, fd_out, file_out, src_size, src_size/, src_size/); /* y: WIDTH*HEIGHT => w*h*/
for (j = ; j < h; j++)
write(fd_out, y_addr + j*WIDTH, w); /* u: WIDTH *HEIGHT/2 => w*h/2*/
for (j = ; j < h/; j++)
write(fd_out, u_addr + j*WIDTH, w); /* v: WIDTH *HEIGHT/2 => w*h/2*/
for (j = ; j < h/; j++)
write(fd_out, v_addr + j*WIDTH, w); CONVERT_END(fd_in, fd_out, y_addr, u_addr, v_addr);
return ;
} int main(int argc, char **argv)
{
int buf_size = WIDTH*HEIGHT; yuv420_2_yuv444("420.yuv", "444.yuv", buf_size);
yuv420_2_yuv422h("420.yuv", "422h.yuv", buf_size);
yuv420_2_yuv422v("420.yuv", "422v.yuv", buf_size);
yuv422h_resize("422h.yuv", buf_size, NEW_WIDTH, NEW_HEIGHT);
yuv422v_resize("422v.yuv", buf_size, NEW_WIDTH, NEW_HEIGHT); return ;
}
非交织YUV格式转换的更多相关文章
- Android 音视频编解码——RGB与YUV格式转换
一.RGB模型与YUV模型 1.RGB模型 我们知道物理三基色分别是红(Red).绿(Green).蓝(Blue).现代的显示器技术就是通过组合不同强度的红绿蓝三原色,来达成几乎任何一种可见光的颜色. ...
- 音视频编解码——RGB与YUV格式转换
一.RGB模型与YUV模型 1.RGB模型 我们知道物理三基色分别是红(Red).绿(Green).蓝(Blue).现代的显示器技术就是通过组合不同强度的红绿蓝三原色,来达成几乎任何一种可见光的颜色. ...
- SQL 将非标准日期格式转换成标准格式,进行条件判断
a.JLDate为非标准日期格式: 例: 2011-8-28 0:00:000011-8-28 0:00:000111-8-4 0:00:00 select CONVERT(varchar(50),C ...
- YUV格式转换RGB(基于opencv)
在编写代码将需要处理YUV格从每个视频帧中提取,然后将其保存为图片.有两种常见的方法在线,第一种是通过opencv自带cvCvtColor,可是这样的方法有bug.得到的图片会泛白.另外一种方法是公式 ...
- 【视频处理】YUV与RGB格式转换
YUV格式具有亮度信息和色彩信息分离的特点,但大多数图像处理操作都是基于RGB格式. 因此当要对图像进行后期处理显示时,需要把YUV格式转换成RGB格式. RGB与YUV的变换公式如下: YUV(25 ...
- YUV与RGB格式转换
YUV格式具有亮度信息和色彩信息分离的特点,但大多数图像处理操作都是基于RGB格式. 因此当要对图像进行后期处理显示时,需要把YUV格式转换成RGB格式. RGB与YUV的变换公式如下: YUV(25 ...
- 【图像处理与医学图像处理】YUV与RGB格式转换速度几种方法对比
[视频处理]YUV与RGB格式转换 YUV格式具有亮度信息和色彩信息分离的特点,但大多数图像处理操作都是基于RGB格式. 因此当要对图像进行后期处理显示时,需要把YUV格式转换成RGB格式. RGB与 ...
- 【DSP开发】【VS开发】YUV与RGB格式转换
[视频处理]YUV与RGB格式转换 YUV格式具有亮度信息和色彩信息分离的特点,但大多数图像处理操作都是基于RGB格式. 因此当要对图像进行后期处理显示时,需要把YUV格式转换成RGB格式. RGB与 ...
- ffmpeg中avframe的YUV格式数据到OpenCV中Mat的BGR格式转换
ffmpeg实现音视频编解码是非常常用的工具,视频解码出来的raw数据是yuv格式,用来进行后续的图像处理一般是RGB格式的.所以需要从yuv到rgb或者bgr的转换,ffmpeg提供了相应的转换AP ...
随机推荐
- 修改Firebug字体
Firebug是一件非常好用的调试工具,然而默认的字体有些单调,设置里又没有更改的选项,那么字体到底能不能更改呢?这个问题困扰了我好久,直到今天我才偶然发现了解决方案. Firebug属于火狐的一个插 ...
- 在CentOS下搭建自己的Git服务器
首先需要装好CentOS系统,作为测试,你可以选择装在虚拟机上,这样比较方便.这步默认你会,就不讲了.有了CentOS,那么如何搭建Git服务器呢?1.首先需要安装Git,可以使用yum源在线安装: ...
- Merge K Sorted Arrays
This problem can be solved by using a heap. The time is O(nlog(n)). Given m arrays, the minimum elem ...
- 转:IOC框架
CSND上看了王泽滨的博客关于IOC的,觉得说的很透彻,地址为:http://blog.csdn.net/wanghao72214/article/details/3969594 1 IoC理论的背景 ...
- .net测试学习--理解.net测试选项
1.创建基于测试简单应用程序 (1)启动visual studio(有安装c#的) (2) 选择File|New project (3)创建一个C# project,名字和保存路径自己设定,假设取名 ...
- Sublime 3 如何设置xftp 排除文件夹“bower_components”,“node_modules”
“bower_components”,“node_modules”这个文件夹,作为模块得引用文件,不需要下载本地进行编码,这里得文件非常多,若是不把这个两个文件夹排除掉掉话,通过xftp下载所有文件的 ...
- 本周psp个人作业
计划--用一天的时间来做这个项目 需求分析--作为一个观众,我想要知道每局的比分,以便我更了解比赛情况. 生成设计文档--用类图来进行说明. 设计复审---无 代码规范--3H 具体设计--建立数据库 ...
- Servlet调用过程
(1)在浏览器输入地址,浏览器先去查找hosts文件,将主机名翻译为ip地址,如果找不到就再去查询dns服务器将主机名翻译成ip地址. (2)浏览器根据ip地址和端口号访问服务器,组织http请求信息 ...
- sqlserver 中数据导入到mysql中的方法以及注意事项
数据导入从sql server 到mysql (将数据以文本格式从sqlserver中导出,注意编码格式,再将文本文件导入mysql中): 1.若从slqserver中导出的表中不包含中文采用: bc ...
- C# Cookie
1 推荐使用 is 或 as 操作符而不是强制 2 编码风格:Tab ——改成两个 C# 文档注释的快捷键 (将配置表压缩,从压缩文件中查找xml配置表 这个是指Unity项目上面) 尽量使 ...