注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

liuyue18301的个人主页

追逐梦想 光辉岁月

 
 
 

日志

 
 

rgb TO yuv420  

2010-02-22 12:17:00|  分类: c 代码 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

#include <stdio.h>#include <stdlib.h>

#include <string.h>

//转换矩阵

#define MY(a,b,c) (( a*  0.2989  + b*  0.5866  + c*  0.1145))

#define MU(a,b,c) (( a*(-0.1688) + b*(-0.3312) + c*  0.5000 + 128))

#define MV(a,b,c) (( a* 0.5000 + b*(-0.4184) + c*(-0.0816) + 128))

//大小判断

#define DY(a,b,c) (MY(a,b,c) > 255 ? 255 : (MY(a,b,c) < 0 ? 0 : MY(a,b,c)))

#define DU(a,b,c) (MU(a,b,c) > 255 ? 255 : (MU(a,b,c) < 0 ? 0 : MU(a,b,c)))

#define DV(a,b,c) (MV(a,b,c) > 255 ? 255 : (MV(a,b,c) < 0 ? 0 : MV(a,b,c)))

//只处理352*288文件

#define WIDTH 352

#define HEIGHT 288

//读BMP

void ReadBmp(unsigned char *RGB,FILE *fp);

//转换函数

void Convert(unsigned char *RGB, unsigned char *YUV);

//入口

int main()

{

    int i=1;

    char file[255];

    FILE *fp;

    FILE *fp2;

    unsigned char *YUV = NULL;

    unsigned char *RGB = NULL;

    unsigned int imgSize = WIDTH*HEIGHT;

    if((fp2 = fopen("CIF文件", "wb")) == NULL)

    {

        return 0;

    }

    RGB = (unsigned char*)malloc(imgSize*6);

    YUV = (unsigned char*)malloc(imgSize + (imgSize>>1));

  

    for(i=1; i<=260; i++)

    {

        sprintf(file, "RGB_%05d.bmp", i);//生成文件名

        if((fp = fopen(file, "rb")) == NULL)

            continue;

        printf("打开文件%s\n", file);

        ReadBmp(RGB, fp);

        Convert(RGB, YUV);

        fwrite(YUV, 1, imgSize+(imgSize>>1), fp2);//写入文件

        fclose(fp);

    }

    fclose(fp2);

    if(RGB)

        free(RGB);

    if(YUV)

        free(YUV);

    printf("完成\n");

    system("pause");

    return 1;

}

//读BMP

void ReadBmp(unsigned char *RGB,FILE *fp)

{

    int i,j;

    unsigned char temp;

    fseek(fp,54, SEEK_SET);

    fread(RGB+WIDTH*HEIGHT*3, 1, WIDTH*HEIGHT*3, fp);//读取

    for(i=HEIGHT-1,j=0; i>=0; i--,j++)//调整顺序

    {

        memcpy(RGB+j*WIDTH*3,RGB+WIDTH*HEIGHT*3+i*WIDTH*3,WIDTH*3);

    }

   

    //顺序调整

    for(i=0; (unsigned int)i < WIDTH*HEIGHT*3; i+=3)

    {

        temp = RGB[i];

        RGB[i] = RGB[i+2];

        RGB[i+2] = temp;

    }

}

void Convert(unsigned char *RGB, unsigned char *YUV)

{

    //变量声明

    unsigned int i,x,y,j;

    unsigned char *Y = NULL;

    unsigned char *U = NULL;

    unsigned char *V = NULL;

   

    Y = YUV;

    U = YUV + WIDTH*HEIGHT;

    V = U + ((WIDTH*HEIGHT)>>2);

    for(y=0; y < HEIGHT; y++)

        for(x=0; x < WIDTH; x++)

        {

            j = y*WIDTH + x;

            i = j*3;

            Y[j] = (unsigned char)(DY(RGB[i], RGB[i+1], RGB[i+2]));

            if(x%2 == 1 && y%2 == 1)

            {

                j = (WIDTH>>1) * (y>>1) + (x>>1);

                //上面i仍有效

                U[j] = (unsigned char)

                       ((DU(RGB[i  ], RGB[i+1], RGB[i+2]) +

                         DU(RGB[i-3], RGB[i-2], RGB[i-1]) +

                         DU(RGB[i  -WIDTH*3], RGB[i+1-WIDTH*3], RGB[i+2-WIDTH*3]) +

                         DU(RGB[i-3-WIDTH*3], RGB[i-2-WIDTH*3], RGB[i-1-WIDTH*3]))/4);

                V[j] = (unsigned char)

                       ((DV(RGB[i  ], RGB[i+1], RGB[i+2]) +

                         DV(RGB[i-3], RGB[i-2], RGB[i-1]) +

                         DV(RGB[i  -WIDTH*3], RGB[i+1-WIDTH*3], RGB[i+2-WIDTH*3]) +

                         DV(RGB[i-3-WIDTH*3], RGB[i-2-WIDTH*3], RGB[i-1-WIDTH*3]))/4);

            }

        }

}

  评论这张
 
阅读(1496)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018