一、这里先解决一下上一篇博文的问题
https://editor.csdn.net/md/?articleId=117398429
颜色不对,是因为我没有选对格式,因为是Y所以需要选择Y
U和V分量不对是因为在YUV里面,U和V一共才占比Y的1/2,所以我们这里需要改变分辨率。而不是用1920x1080的分辨率。但是对应的960x540对的分辨率是没有的,所以我换了一张分辨率的图
这里换成1280x720的
这里就没啥问题了啊
附上代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int testYUV420(char* fileName, int width, int hight)
{
FILE* fp;
FILE* fp1;
FILE* fp2;
FILE* fp3;
char* readBuf;
readBuf = malloc(width * hight * 3/2);
fp = fopen(fileName,"r+" );
fp1 = fopen("girl_1.y","w+");
fp2 = fopen("girl_1.u", "w+");
fp3 = fopen("girl_1.v", "w+");
//读取YUV文件
fread(readBuf,1, width * hight * 3 / 2,fp);
//写入到新的YUV.的Y图片中
fwrite(readBuf,1, width * hight , fp1);
//写入到新的YUV.的U图片中
fwrite(readBuf+ width * hight, 1, width * hight/4, fp2);
//写入到新的YUV.的V图片中
fwrite(readBuf + width * hight * 5/4, 1, width * hight / 4, fp3);
//释放空间
free(readBuf);
fclose(fp);
fclose(fp1);
fclose(fp2);
fclose(fp3);
}
int main()
{
testYUV420("girl_1.yuv",1280,720);
return 0;
}
YUV444的分离方式一样,只要改改写入新的YUV中的width和hight,因为YUV444之中YUV的占比不一样。
YUV444分离改变地方
fwrite(readBuf,1, width * hight , fp1);
//写入到新的YUV.的U图片中
fwrite(readBuf+ width * hight, 1, width * high, fp2);
//写入到新的YUV.的V图片中
fwrite(readBuf + width * hight * 2, 1, width * hight , fp3);
二、去除颜色
刚才我们是将YUV三种分离,我们只能通过用Y来显示图片,如果用YUV420格式的话,我们看到的颜色是不对得到,就是上一篇博文那种。或则直接黑色。
因为YUV的偏置原理我们只需要将U和V数据改为128就可以了(上一篇文章的补充有讲,或者直接去C一下就好)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define outPutFileName "girl_2.yuv"
int Yuv420(char *fileName, int width, int height)
{
FILE *fp;
FILE *fp1;
unsigned char *readBuf;
readBuf = (unsigned char *)malloc(width*height*3/2);
fp = fopen(fileName, "rb+");
fp1 = fopen(outPutFileName, "wb+");
//读取YUV文件
fread(readBuf, 1, width*height, fp);
//将UV初始化为128
memset(readBuf+width*height, 128, width*height/2);
写入到新的YUV
fwrite(readBuf, 1, width*height*3/2, fp1);
free(readBuf);
fclose(fp);
fclose(fp1);
return 0;
}
int main()
{
Yuv420("girl_1.yuv", 1280, 720);
return 0;
}
这里选择YUV420依旧显示黑白。
三、图片改变亮度
只需要将每个像素的Y的值减半就行了
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define outPutFileName "girl_3.yuv"
int Yuv420(char *fileName, int width, int height)
{
FILE *fp;
FILE *fp1;
unsigned char *readBuf;
unsigned char *point;
readBuf = (unsigned char *)malloc(width*height*3/2);
point = readBuf;
fp = fopen(fileName, "rb+");
fp1 = fopen(outPutFileName, "wb+");
//读取YUV文件
fread(readBuf, 1, width*height, fp);
//亮度减半
for(int i = 0; i < width*height; i++)
{
//对 point的值进行减半处理
*point = *point/2;
point++;
}
//写入到新的YUV
fwrite(readBuf, 1, width*height*3/2, fp1);
free(readBuf);
fclose(fp);
fclose(fp1);
return 0;
}
int main()
{
Yuv420("girl_1.yuv", 1280, 720);
return 0;
}
。。我不知道在这儿是什么情况。感觉代码也没啥问题啊。
单独的用Y显示可以看出来,亮度变低了难道我的U和V是改变了??后面还要在研究研究。