一、之前的代码
#include <stdio.h>
#include <stdlib.h>
int main()
{
FILE *fp1 = NULL;
FILE *fp2 = NULL;
unsigned char *readBuf;
readBuf = malloc(256*256*3/2);
fp1 = fopen("lena_256x256_yuv420p.yuv","rd+");
fp2 = fopen("new_256x256_yuv420p.yuv","wd+");
fread(readBuf,1,256*256*3/2,fp1);
for(int i = 0;i < 256*256; i++)
{
readBuf[i] = readBuf[i]/2;
}
fwrite(readBuf,1,256*256*3/2,fp2);
free(readBuf);
fclose(fp1);
fclose(fp2);
return 0;
}
就是将图像亮度减半。
二、为啥要优化代码
为了可以使代码有更好的扩展线性。
虽然上面代码完成了我们目的,但是如果我们将这个代码使用在其余的地方,我们是不是就不可以了,所以要优化代码。
#include <stdio.h>
#include <stdlib.h>
//封装一个函数接口
int saveDataToFile(unsigned char *dataAddr,long sizeData,const char *fileName)
{
FILE *fp = NULL;
int nRet = 0;
//dataAddr,sizeData只要1一个是空的时候,对他们进行逻辑取反,变成真,然后进入循环
if (!dataAddr || !sizeData)
{
printf("wrong dataAddr sizeData\n");
return -1;
}
//同样的道理
if (!fileName)
{
printf("wrong fileName\n");
return -2;
}
//都没问题。打开文件,因为要对文件进行写入,wb+
fp = fopen(fileName,"wb+");
if (!fp)
{
printf("open file wrong\n");
return -3;
}
//写入文件
nRet = fwrite(dataAddr,1,sizeData,fp);
if (nRet < 0)
{
printf("write file\n");
return -4;
}
fclose(fp);
return 0;
}
//封装一个Y分量减半的函数
int halfDataY(const char *openFileName, const char *writeFileName,long sizeData, long sizeDataY)
{
int nRet = 0;
FILE *fp = NULL;
unsigned char *dataAddr = NULL;
dataAddr = malloc(sizeData);
if (!openFileName)
{
printf("wrong openFileName\n");
return -1;
}
if (!sizeData)
{
printf("wrong sizeData\n");
return -2;
}
//打开文件。rb+
fp = fopen(openFileName,"rb+");
if (!fp)
{
printf("open file wrong");
return -3;
}
nRet = fread(dataAddr,1,sizeData,fp);
if (nRet < 0)
{
printf("fread file\n");
return -4;
}
for (int i =0;i<sizeDataY;i++)
{
dataAddr[i] = dataAddr[i] / 2;
}
//调用刚才封装的接口
nRet = saveDataToFile(dataAddr,sizeData, writeFileName);
if (nRet < 0)
{
printf("saveData filed,nRet = %d\n",nRet);
return -5;
}
free(dataAddr);
fclose(fp);
return 0;
}
int main()
{
int nRet = 0;
halfDataY("lena_256x256_yuv420p.yuv","new_256x256_yuv420p.yuv",256 * 256 * 3/2,256*256);
if (nRet < 0)
{
printf("saveData filed,nRet = %d\n", nRet);
return 0;
}
return 0;
}
所以下次我们是不是只需要需修改main函数里面的东西就可以。