YUV像素减半之代码优化

一、之前的代码

#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函数里面的东西就可以。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

永不秃头的程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值