下面代码可以读入.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;
}
转载于:https://blog.51cto.com/datou97/564554