//读取的文件是(*.bmp黑白图像),(256×256)色的
#include <fstream>
#include <iostream>
using namespace std;
typedef unsigned char var8;
typedef unsigned int uvar32;
typedef unsigned short int uvar16;
typedef struct { var8 Blue,Green,Red,Reserved;} Palette;
int main()
{
uvar32 Size,Offset,Height,Width,Compress,Reserved,
InfoHeaderSize,Colors,ImportantColors,DataSize,HResolution,VResolution;
uvar16 Planes,Bit;
int i;
var8 type[2],imdata[256][256]; //数据
Palette Rgbquad;
ifstream fin; //输入图象文件
//ofstream fout("shuju.txt",ios::out|ios::binary); //输出数据文件
ofstream fout1("shuju1.txt",ios::out|ios::binary); //输出数据文件
ofstream fout2("shuju2.txt",ios::out|ios::binary); //输出数据文件
ofstream fout3("shuju3.txt",ios::out|ios::binary); //输出数据文件
ofstream fout4("shuju4.txt",ios::out|ios::binary); //输出数据文件
ofstream fout5("shuju5.txt",ios::out|ios::binary); //输出数据文件
ofstream fout6("shuju6.txt",ios::out|ios::binary); //输出数据文件
ofstream fout7("shuju7.txt",ios::out|ios::binary); //输出数据文件
ofstream fout8("shuju8.txt",ios::out|ios::binary); //输出数据文件
ofstream fout9("shuju9.txt",ios::out|ios::binary); //输出数据文件
ofstream fout10("shuju10.txt",ios::out|ios::binary); //输出数据文件
ofstream fout11("shuju11.txt",ios::out|ios::binary); //输出数据文件
ofstream fout12("shuju12.txt",ios::out|ios::binary); //输出数据文件
ofstream fout13("shuju13.txt",ios::out|ios::binary); //输出数据文件
ofstream fout14("shuju14.txt",ios::out|ios::binary); //输出数据文件
ofstream fout15("shuju15.txt",ios::out|ios::binary); //输出数据文件
ofstream fout16("shuju16.txt",ios::out|ios::binary); //输出数据文件
fin.open("Zelda256.bmp",ios::binary); //以二进制读方式打开该文件,一定要二进制的!
if(!fin)
{
cout<<"No this file!\n";
return 1;
}
fin.read((char*)&type ,2);/* 两字节的内容用来识别位图的类型,偏移量0,结果file type: BM*/
cout<<"file type: "<<type[0]<<type[1]<<endl;
fin.read((char*)&Size ,sizeof(uvar32));/*整个文件的大小,偏移量2,结果file size: 66614*/
cout<<"file size: "<<Size<<endl;
fin.read((char*)&Reserved,sizeof(uvar32));/*保留,必须设置为0, 偏移量6,结果Reserved dword: 0*/
cout<<"Reserved dword: "<<Reserved<<endl;
fin.read((char*)&Offset ,sizeof(uvar32));
cout<<"Offset: "<<Offset<<endl; // /*从文件开始到位图数据开始之间的数据(bitmap data)之间的偏移量
//,偏移量10,结果Offset: 1078。位图数据为256*256,
// 65536(位图数据)+1078(偏移量)=66614(文件大小)*/
fin.read((char*)&InfoHeaderSize,sizeof(uvar32));// /*位图信息头(Bitmap Info Header)的长度,偏移量14,
cout<<"Bitmap Info Header Size: "<<InfoHeaderSize<<endl; // 结果 Bitmap Info Header Size: 40*/
fin.read((char*)&Width,sizeof(uvar32));/*位图的宽度,以象素为单位,偏移量18,Bitmap Width: 256*/
cout<<"Bitmap Width: "<<Width<<endl;
fin.read((char*)&Height,sizeof(uvar32));// /*位图的高度,以象素为单位,如果该值是一个正数,说明图像是倒向的,
cout<<"Bitmap Height: "<<Height<<endl;//如果该值是一个负数,则说明图像是正向的。偏移量22,Bitmap Height: 256*/
fin.read((char*)&Planes,sizeof(uvar16));/*位图的位面数(注:该值将总是1),偏移量26,Bitmap Planes: 1*/
cout<<"Bitmap Planes: "<<Planes<<endl;
fin.read((char*)&Bit,sizeof(uvar16));/*每个象素的位数,偏移量28,256色应该8bit,Bits per Pixel: 8*/
cout<<"Bits per Pixel: "<<Bit<<endl;
fin.read((char*)&Compress,sizeof(uvar32));/*压缩说明0为不压缩,偏移量30,Compresssion Y or N: 0*/
cout<<"Compresssion Y or N: "<<Compress<<endl;
if(Compress) ///*用字节数表示的位图数据的大小,偏移量34,256*256=65536,
{ fin.close();
return 2;
}
fin.read((char*)&DataSize,sizeof(uvar32));// Data Size: 65536*/
cout<<"Data Size: "<<DataSize<<endl;
fin.read((char*)&HResolution,sizeof(uvar32)); /*用象素/米表示的水平分辨率,偏移量38,HResolution: 0*/
cout<<"HResolution: "<<HResolution<<endl;
fin.read((char*)&VResolution,sizeof(uvar32));/*用象素/米表示的垂直分辨率,偏移量42,VResolution: 0*/
cout<<"VResolution: "<<VResolution<<endl;
fin.read((char*)&Colors,sizeof(uvar32)); /*位图使用的颜色数,256色,偏移量46,Colors: 256*/
cout<<"Colors: "<<Colors<<endl;
fin.read((char*)&ImportantColors,sizeof(uvar32));///*指定重要的颜色数。当该域的值等于颜色数时(或者等于0时),
cout<<"ImportantColors: "<<ImportantColors<<endl;//表示所有颜色都一样重要。偏移量50,ImportantColors: 0*/
///*调色板规范。对于调色板中的每个表项,这4个字节用下述方法来
// 描述RGB的值:1字节用于蓝色分量 ,1字节用于绿色分量 ,1字节用于红色分量
// 1字节用于填充符(设置为0),偏移量由54到54+255*4=1074,对于彩色图像R,G,B
// 有各自的分量,对与黑白图像,R=G=B=灰度级。输出结果有 0 0 0 0,1 1 1 0…
// 255 255 255 0*/
for(i=0;i<256;i++)
{
fin.read((char*)&Rgbquad,sizeof(Palette));
cout<<int(Rgbquad.Blue)<<" "<<int(Rgbquad.Green)<<" "<<int(Rgbquad.Red)<<" "<<int(Rgbquad.Reserved)<<endl;
}
uvar32 x;
fin.seekg(Offset,ios::beg);
for(int i1=0;i1<64;i1++)
for(int j1=0;j1<256;j1++)
{
fin.read((char*)&imdata[i1][j1],sizeof(var8));
x=uvar32(imdata[i1][j1]);
if(j1<64)
fout1<<x<<" ";
else if(j1<128)
fout2<<x<<" ";
else if(j1<192)
fout3<<x<<" ";
else
fout4<<x<<" ";
}
for(int i2=64;i2<128;i2++)
for(int j2=0;j2<256;j2++)
{
fin.read((char*)&imdata[i2][j2],sizeof(var8));
x=uvar32(imdata[i2][j2]);
if(j2<64)
fout5<<x<<" ";
else if(j2<128)
fout6<<x<<" ";
else if(j2<192)
fout7<<x<<" ";
else
fout8<<x<<" ";
}
for(int i3=128;i3<192;i3++)
for(int j3=0;j3<256;j3++)
{
fin.read((char*)&imdata[i3][j3],sizeof(var8));
x=uvar32(imdata[i3][j3]);
if(j3<64)
fout9<<x<<" ";
else if(j3<128)
fout10<<x<<" ";
else if(j3<192)
fout11<<x<<" ";
else
fout12<<x<<" ";
}
for(int i4=0;i4<64;i4++)
for(int j4=0;j4<256;j4++)
{
fin.read((char*)&imdata[i4][j4],sizeof(var8));
x=uvar32(imdata[i4][j4]);
if(j4<64)
fout13<<x<<" ";
else if(j4<128)
fout14<<x<<" ";
else if(j4<192)
fout15<<x<<" ";
else
fout16<<x<<" ";
}
/*for( i=0;i<256;i++)
for(j=0;j<256;j++)
{
fin.read((char*)&imdata[i][j],sizeof(var8));
x=uvar32(imdata[i][j]);
if((j+1)%256==0)
fout<<x<<endl;
else fout<<x;
fout<<" ";
}*/
/*直接把65536个像素的灰度读入数组imdata中,由于前面调色板的格式,读出的数据无
需 索引调色板。由于Height值大于零,图像倒置的,开始读入的数据是图像最后一行的灰
度值。*/
fin.close();
return 0;
}
///
评论0