读取bmp文件

来源:互联网 发布:淘宝内部优惠券app 编辑:程序博客网 时间:2024/04/27 23:08

 #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];
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];
}
 
FILE *temp;
if((temp = fopen("C://temp.bmp","wb"))==NULL)//写二进制文件
{
cout<<"the file can not be built!"<<endl;
exit(1);
}
 
 //copy the data
fwrite(&bmpHeader,sizeof(bmpHeader),1,temp);
fwrite(&bmpInfHeader,sizeof(bmpInfHeader),1,temp);
fseek(temp,bmpHeader.bfOffBits,0);
fwrite(tempData,bmpHeader.bfSize,1,temp);
 
fclose(fpBmp);
fclose(temp);
 
return 0;
}
//这样可以实现读出一个bmp文件并写到另外一个文件里
原创粉丝点击