预备知识
代码解释
可以通过修改宏定义来修改图像的尺寸
可以通过修改YUV分量来对图像的颜色进行编辑
YUV中一个像素是一个字节,如果用变量编辑YUV分量,需要注意变量类型,常量就不用
为什么使用移位不用数学运算?
答:良好的代码风格
计算机中移位的效率比数学运算高得多
(不了解的建议补充一下基础)
代码
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#define LUX_SUCCESS 1
#define LUX_FAILED -1
#define LUX_YUV_WIDTH 1920
#define LUX_YUV_HEIGHT 1080
#define LUX_YUV_Y 0
#define LUX_YUV_U 128
#define LUX_YUV_V 128
#define LUX_YUV_File_Name "dst_yuv"
int main(void)
{
int len = 0;
FILE *LUX_YUV_DstFile = NULL;
char *LUX_YUV_Data = NULL;
int yuvSize = LUX_YUV_WIDTH * LUX_YUV_HEIGHT * 3 >> 1;
int yOffset = LUX_YUV_WIDTH * LUX_YUV_HEIGHT;
int uOffset = LUX_YUV_WIDTH * LUX_YUV_HEIGHT >> 2;
LUX_YUV_Data = (char *)malloc(yuvSize);
if (NULL == LUX_YUV_Data)
{
printf("malloc LUX_YUV_Data error\n");
perror("malloc LUX_YUV_Data error");
return LUX_FAILED;
}
//YUV 420
//Y
memset(LUX_YUV_Data, LUX_YUV_Y, LUX_YUV_WIDTH * LUX_YUV_HEIGHT);
//U
memset(LUX_YUV_Data + yOffset, LUX_YUV_U, LUX_YUV_WIDTH * LUX_YUV_HEIGHT >> 2);
//V
memset(LUX_YUV_Data + yOffset + uOffset, LUX_YUV_V, LUX_YUV_WIDTH * LUX_YUV_HEIGHT >> 2);
LUX_YUV_DstFile = fopen(LUX_YUV_File_Name, "w+");
if(NULL == LUX_YUV_DstFile)
{
printf("fopen LUX_YUV_DstFile failed\n");
perror("why");
return LUX_FAILED;
}
len = fwrite(LUX_YUV_Data, 1, yuvSize, LUX_YUV_DstFile);
if(len <= 0)
{
printf("fread failed\n");
perror("why:");
return LUX_FAILED;
}
fclose(LUX_YUV_DstFile);
free(LUX_YUV_Data);
return LUX_SUCCESS;
}
查看图像
使用YUV Player查看
注意调试的时候需要将工具关闭,否则文件被工具占用,新生成的文件无法覆盖