非交织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 ...
随机推荐
- git知识点整理
- linux下编译gcc6.2.0
linux下编译gcc6.2.0 在archlinx的下gcc已经更新到6.2.1了,win10的WSL下还是gcc4.8.官方源没有比较新的版本,于是自己编译使用. GCC6的几个新特性 GCC 6 ...
- scenejs的一点Cameras小笔记
视图模式: 一如官网所见,这个cameras 是控制的视口的东西. 他有如下4个模式 1.orbit模式 鼠标拖中物体,切换视口观察物体,鼠标滚轮变换, 放大缩小可视范围. 2.orbit/spin模 ...
- 在cygwin部署hadoop出现的问题:$ ./bin/hadoop version 显示错误: 找不到或无法加载主类 org.apache.hadoop.util.VersionInfo
解决方案 找到hadoop主目录的bin文件夹下的hadoop文件,将倒数第二行 exec "$JAVA" $JAVA_HEAP_MAX $HADOOP_OPTS $CLASS & ...
- select样式美化(简单实用)
美化select,可以实用一个a标签将select嵌套进去,然后将<a>相对定位,在将select绝对定位,美化<a>即可 文件下载链接:https://i.cnblogs.c ...
- JAVA程序中SQL语句无法传递中文参数
vi /etc/my.cnf [mysqld]# The default character set that will be used when a new schema or table is# ...
- C#中的匿名方法
C#中的匿名方法是在C#2.0引入的,它终结了C#2.0之前版本声明委托的唯一方法是使用命名方法的时代.虽然在 C# 3.0 及更高版本中,Lambda 表达式取代了匿名方法,作为编写内联代码的首选方 ...
- Tensorflow serving的编译
Tensorflow serving提供了部署tensorflow生成的模型给线上服务的方法,包括模型的export,load等等. 安装参考这个 https://github.com/tensorf ...
- C++ Tips and Tricks
整理了下在C++工程代码中遇到的技巧与建议. 0x00 巧用宏定义. 经常看见程序员用 enum 值,打印调试信息的时候又想打印数字对应的字符意思.见过有人写这样的代码 if(today == MON ...
- 使用PowerShell来修改文件访问,创建,修改时间属性
Function Set-FileTimeStamps { Param ( [Parameter(mandatory=$true)] [string[]]$path, [datetime]$date ...