非交织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 ...
随机推荐
- 架构和模式的区别:三层架构和MVC在应用开发中的位置
架构是系统层面的,可以是多层架构,也可以是事件驱动架构,也可以是微服务架构. 模式是GUI应用的一种职责分离设计. 三层架构(包含多层架构)和 MVC模式(包含MVP, MVVM) 没什么关系,它们不 ...
- SQL Server子查询实例
例子一 SELECT COUNT(*) FROM ( SELECT [PersonID] FROM [tbiz_AssScore] GROUP BY PersonID ) M 语法说明: 1).FRO ...
- 【JavaScript】JS 中 原始字符串 和 HTML 字符转换
参考资料:http://www.sjyhome.com/javascript/js-html-escape.html JS转换HTML转义符 SJY • 发表于:2013年10月05日 17:04 • ...
- 基于SS5服务端的Socks5客户端
SS5停止更新已经好几年了,用作socks5代理的服务端还是比较稳定的.但是如果要使用加密账号和密码的协议,有些坑需要去填. 1.服务端的账号密码验证方式配置为“s”时,客户端进行协议验证时,需要用“ ...
- 排序之----插入排序(C#实现)
算法步骤:(从小到大) 1:将第一个元素与第二个元素比较大小,如果第一个元素小于等于第二个元素,不做处理,继续比较第二个元素和第三个元素. 如果第三个元素小于第二个元素,保存要移动的元素(第三个元素) ...
- JqueryEasyUI之DataGrid扩展
DataGrid通用合并扩展方法: $.extend($.fn.datagrid.methods, { autoMergeCells: function (jq, fields) { return j ...
- ajax+php+mysql 实现点赞、局部刷新,每个IP只能对一篇文章点赞一次
主要流程: 点赞—>判断当前设备IP是否对当前文章有过点赞记录—>若有记录,弹出提示“已经赞过了”; 若无记录,当前文章点赞数+1,并在记录设备IP点赞记录的表中插入信息. 文章表 art ...
- Swift - 键盘弹起,遮挡输入框
extension LoginViewController:UITextFieldDelegate { func textFieldShouldReturn(textField: UITextFiel ...
- APP开发 Token生成 验证
准备好协议(HTTP).数据表示方法(JSON).请求数据的方法(REST) 选择一个合适的框架 接口特点汇总: 1.因为是非开放性的,所以所有的接口都是封闭的,只对公司内部的产品有效: 2.因为是非 ...
- 一、常见PHP网站安全漏洞
对于PHP的漏洞,目前常见的漏洞有五种.分别是Session文件漏洞.SQL注入漏洞.脚本命令执行漏洞.全局变量漏洞和文件漏洞.这里分别对这些漏洞进行简要的介绍. 1.session文件漏洞 Sess ...