下面代码可以读入.txt文档中的二维数组,然后经过封装形成.bmp文件保存

(其中 TXT文档中的数组要按照实际位图数据一行一行写)

 

#include<iostream>

#include<fstream>

#include<string>

#include<vector>

#include<windows.h>

using namespace std;

 typedef struct{

int n_row;

int n_col;

int n_pixel;

int app;

} Matrix;

 typedef struct{

const  char* tmp;

int  n_1;

int  n_10;

int  n_100;

int  number;

 }DataChange;

bool filetoVector(string filename,vector<string>& data_in_line,vector<string>& data_in_number )

{

ifstream inFile(filename.c_str());

if(!inFile) return 1;

string s;

while(getline(inFile,s))

data_in_line.push_back(s);//每个元素对应图像的一行数据

inFile.clear();

inFile.close();

 

inFile.open(filename.c_str());

if(!inFile) return 1;

while(inFile>>s)

data_in_number.push_back(s);

inFile.close();

 

return 0;

}

int main()

{

vector<string> data_in_line;

vector<string> data_in_number;

vector<int> data_in_int;

string fileName;

 

DataChange data_change;

Matrix matrix;

matrix.n_col=0;

matrix.n_pixel=0;

matrix.n_row=0;

matrix.app=0;

data_change.n_1=0;

data_change.n_10=0;

data_change.n_100=0;

data_change.number=0;

data_change.tmp=NULL;

 

cout<<"请输入位图数据文件名(.txt): ";

 

cin>>fileName;

if(filetoVector(fileName,data_in_line,data_in_number)){

cout<<"无法打开文件!"<<fileName<<endl;

return -1;

}

vector<string>::iterator it_to_line=data_in_line.begin();

vector<string>::iterator it_to_number=data_in_number.begin();

 

for(it_to_line=data_in_line.begin();it_to_line!=data_in_line.end();++it_to_line)

{

//cout<<*it_to_line<<endl;

++matrix.n_row;

}

for(it_to_number=data_in_number.begin();it_to_number!=data_in_number.end();++it_to_number)

{

data_change.tmp=(*it_to_number).data();

if((*it_to_number).length()==3)

{

data_change.n_100=(int)((data_change.tmp[0])-48);

data_change.n_10=(int)((data_change.tmp[1])-48);

data_change.n_1=(int)((data_change.tmp[2])-48);

data_change.number=100*data_change.n_100+10*data_change.n_10+data_change.n_1;

data_in_int.push_back(data_change.number);

}

if((*it_to_number).length()==2)

{

data_change.n_10=(int)((data_change.tmp[0])-48);

data_change.n_1=(int)((data_change.tmp[1])-48);

data_change.number=10*data_change.n_10+data_change.n_1;

data_in_int.push_back(data_change.number);

}

if((*it_to_number).length()==1)

{

data_change.n_1=(int)((data_change.tmp[0])-48);

data_change.number=data_change.n_1;

data_in_int.push_back(data_change.number);

}

++matrix.n_pixel;

}

 

matrix.n_col=matrix.n_pixel/matrix.n_row;

matrix.app=4-matrix.n_col%4;

matrix.app!=4 ? (matrix.n_col+=matrix.app):0; 

matrix.n_pixel=matrix.n_col*matrix.n_row;

 

//cout<<matrix.n_row<<endl<<matrix.n_pixel;

//cout<<endl;

 

unsigned char* data=new unsigned char[matrix.n_pixel];

 

int i=0;

vector<int>::iterator it_to_int=data_in_int.begin();

if(matrix.app==4)

{

for(it_to_int=data_in_int.begin();it_to_int!=data_in_int.end();++it_to_int)

{

data[i]=(unsigned char)(*it_to_int);

++i;

//cout<<(int)*it_to_int;

//cout<<(int)data[i];

}

}

if(matrix.app!=4)

{

for(it_to_int=data_in_int.begin();it_to_int!=data_in_int.end();++i)

{

if(i%matrix.n_col<=(matrix.n_col-matrix.app-1))

{

data[i]=(unsigned char)(*it_to_int);

++it_to_int;

//cout<<(int)*it_to_int;

//cout<<(int)data[i];

}

else

data[i]=0;

}

}

unsigned char hBitMapInfo[sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)* 256];  

        BITMAPINFO *bmp_info=(tagBITMAPINFO *) hBitMapInfo; 

BITMAPFILEHEADER bmp_file_header;

BITMAPFILEHEADER*   p_bmp_file_header=&bmp_file_header;

 

for( i=0;i<256;i++)

{

bmp_info->bmiColors[i].rgbBlue=i;

bmp_info->bmiColors[i].rgbGreen=i;

bmp_info->bmiColors[i].rgbRed=i;

bmp_info->bmiColors[i].rgbReserved=0;

}   

bmp_info->bmiHeader.biSize =sizeof(BITMAPINFOHEADER);

bmp_info->bmiHeader.biWidth =matrix.n_col;

bmp_info->bmiHeader.biHeight =matrix.n_row;//根据实际情况,DIB or DDB ,故可能是-matrix.n_row

bmp_info->bmiHeader.biPlanes =1;

bmp_info->bmiHeader.biBitCount =8;

bmp_info->bmiHeader.biCompression =BI_RGB;

bmp_info->bmiHeader.biSizeImage =0;

bmp_info->bmiHeader.biXPelsPerMeter =0;         

bmp_info->bmiHeader.biYPelsPerMeter =0;          

bmp_info->bmiHeader.biClrImportant =0;

bmp_info->bmiHeader.biClrUsed =0;

 

bmp_file_header.bfType = ((WORD)('M'<<8)|'B');

bmp_file_header.bfReserved1= 0;

bmp_file_header.bfReserved2= 0;

bmp_file_header.bfOffBits=       (DWORD(sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+

                                         256*sizeof(RGBQUAD));

bmp_file_header.bfSize          =(DWORD)(bmp_file_header.bfOffBits+(DWORD)matrix.n_pixel);

 

ofstream outFile;

string bmpname;

cout<<"请输入需要建立的位图文件名称(.bmp): ";

cin>>bmpname;

outFile.open(bmpname.c_str(),ios::out|ios::binary|ios::app);

outFile.write((const char*)p_bmp_file_header,sizeof(BITMAPFILEHEADER));

outFile.write((const char*)bmp_info,1064);

outFile.write((const char*)data,matrix.n_pixel);

outFile.clear();

outFile.close();

cout<<"您输入的位图大小为:"<<matrix.n_row<<"×"<<matrix.n_col<<endl;

delete [] data;

return 0;

}