RGB到YUV的转换

 #include <stdlib.h>

#include <iostream>
#include <windows.h>
using namespace std;
 
BITMAPFILEHEADER bmpHeader;//包含文件类型、大小和布局的信息
 
BITMAPINFOHEADER bmpInfHeader;//包含位图的尺寸和颜色格式
 
int main()
{
FILE *fpBmp;
if((fpBmp = fopen("C://lenna512c.bmp","rb"))==NULL)
{
cout<<"the bmp file can not open!"<<endl;
exit(1);
}
//read the BITMAPFILEHEADER
fread(&bmpHeader.bfType,2,1,fpBmp);//第二个参数:项的大小,以字节为单位  第三个参数:要被读的项的最大数目
fread(&bmpHeader.bfSize,4,1,fpBmp);
fread(&bmpHeader.bfReserved1,2,1,fpBmp);
fread(&bmpHeader.bfReserved2,2,1,fpBmp);
fread(&bmpHeader.bfOffBits,4,1,fpBmp);
//test
cout<<"bmpHeader.bfType:"<<bmpHeader.bfType<<endl;//文件类型,一定是BM
cout<<"bmpHeader.bfSize:"<<bmpHeader.bfSize<<endl;//位图文件的大小,单位是字节
cout<<"bmpHeader.bfReserved1:"<<bmpHeader.bfReserved1<<endl;//保留字,一定为0
cout<<"bmpHeader.bfReserved2:"<<bmpHeader.bfReserved2<<endl;//保留字,一定为0
cout<<"bmpHeader.bfOffBits:"<<bmpHeader.bfOffBits<<endl;//偏移量,从BITMAPFILEHEADER结构到位图位
//read the BITMAPINFOHEADER
fread(&bmpInfHeader.biSize,4,1,fpBmp);//结构所需的字节数
fread(&bmpInfHeader.biWidth,4,1,fpBmp);//位图的宽度,以像素为单位
fread(&bmpInfHeader.biHeight,4,1,fpBmp);//位图的高度,以像素为单位
fread(&bmpInfHeader.biPlanes,2,1,fpBmp);//目标设备的平面数,必须为1
fread(&bmpInfHeader.biBitCount,2,1,fpBmp);//一个像素的位数
fread(&bmpInfHeader.biCompression,4,1,fpBmp);//自下而上的压缩的位图的压缩类型,可以是BI_RGB,BI_RLE8,BI_RLE4,BI_BITFIELDS,BI_JPEG
fread(&bmpInfHeader.biSizeImage,4,1,fpBmp);//指定图像的大小,以字节为单位。BI_RGB位图设置为0
fread(&bmpInfHeader.biXPelsPerMeter,4,1,fpBmp);//指定目标设备的位图水平分辨率,以每米像素为单位
fread(&bmpInfHeader.biYPelsPerMeter,4,1,fpBmp);//指定目标设备的位图垂直分辨率,以每米像素为单位
fread(&bmpInfHeader.biClrUsed,4,1,fpBmp);//指定实际应用于位图中的颜色表中的颜色索引数
fread(&bmpInfHeader.biClrImportant,4,1,fpBmp);//指定用于显示位图需要的颜色索引数。若为0,则所有颜色都需要。
 
 
//test the read data
cout<<"bmpInfHeader.biSize: "<<bmpInfHeader.biSize<<endl;
cout<<"bmpInfHeader.biWidth: "<<bmpInfHeader.biWidth<<endl;
cout<<"bmpInfHeader.biHeight: "<<bmpInfHeader.biHeight<<endl;
cout<<"bmpInfHeader.biPlanes: "<<bmpInfHeader.biPlanes<<endl;
cout<<"bmpInfHeader.biBitCount: "<<bmpInfHeader.biBitCount<<endl;
cout<<"bmpInfHeader.biCompression: "<<bmpInfHeader.biCompression<<endl;
cout<<"bmpInfHeader.biSizeImage: "<<bmpInfHeader.biSizeImage<<endl;
cout<<"bmpInfHeader.biXPelsPerMeter: "<<bmpInfHeader.biXPelsPerMeter<<endl;
cout<<"bmpInfHeader.biYPelsPerMeter: "<<bmpInfHeader.biYPelsPerMeter<<endl;
cout<<"bmpInfHeader.biClrUsed: "<<bmpInfHeader.biClrUsed<<endl;
cout<<"bmpInfHeader.biClrImportant: "<<bmpInfHeader.biClrImportant<<endl;
 
// read bmp data
unsigned char *bmpData = new unsigned char[bmpHeader.bfSize];
fseek(fpBmp,bmpHeader.bfOffBits,0);
fread(bmpData,1,bmpHeader.bfSize,fpBmp);
unsigned char *tempData = new unsigned char[bmpHeader.bfSize];
unsigned char *result1=new unsigned char[bmpHeader.bfSize];
unsigned char *result2=new unsigned char[bmpHeader.bfSize];
unsigned char *result3=new unsigned char[bmpHeader.bfSize];
int count=0;
 for(int i = 0;i<bmpInfHeader.biHeight;i++)
for(int j = 0;j<bmpInfHeader.biWidth*3;j+=3)
{
tempData[count++] = bmpData[i*bmpInfHeader.biWidth*3 + j];
tempData[count++] = bmpData[i*bmpInfHeader.biWidth*3 + j+1];
tempData[count++] = bmpData[i*bmpInfHeader.biWidth*3 + j+2];
}
int count1=0;
int count2=0;
int count3=0;
for(i=0;i<count;i++)
{
result1[count1++]=(unsigned char)(0.299*tempData[i]+0.587*tempData[i+1]+0.114*tempData[i+2]);
result2[count2++]=(unsigned char)(-0.147*tempData[i]-0.289*tempData[i+1]+0.436*tempData[i+2]);
result3[count3++]=(unsigned char)(0.615*tempData[i]-0.515*tempData[i+1]-0.1*tempData[i+2]);
 
}
FILE *temp1,*temp2,*temp3;
if((temp1 = fopen("C://y.bmp","wb"))==NULL)
{
cout<<"the file can not be built!"<<endl;
exit(1);
}
if((temp2 = fopen("C://u.bmp","wb"))==NULL)
{
cout<<"the file can not be built!"<<endl;
exit(1);
}
if((temp3 = fopen("C://v.bmp","wb"))==NULL)
{
cout<<"the file can not be built!"<<endl;
exit(1);
}
fwrite(&bmpHeader,sizeof(bmpHeader),1,temp1);
fwrite(&bmpInfHeader,sizeof(bmpInfHeader),1,temp1);
fseek(temp1,bmpHeader.bfOffBits,0);
fwrite(result1,bmpHeader.bfSize,1,temp1);
 
fwrite(&bmpHeader,sizeof(bmpHeader),1,temp2);
fwrite(&bmpInfHeader,sizeof(bmpInfHeader),1,temp2);
fseek(temp2,bmpHeader.bfOffBits,0);
fwrite(result2,bmpHeader.bfSize,1,temp2);
 
fwrite(&bmpHeader,sizeof(bmpHeader),1,temp3);
fwrite(&bmpInfHeader,sizeof(bmpInfHeader),1,temp3);
fseek(temp3,bmpHeader.bfOffBits,0);
fwrite(result3,bmpHeader.bfSize,1,temp3);
fclose(fpBmp);
fclose(temp1);
fclose(temp2);
fclose(temp3);
return 0;
}
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值