#include <fstream>
#include <string>
#include <iostream>
#include "windows.h"
using namespace std;
void istraukimas(int,int,char[]);
void convertavimas();
void apvertimas(int);
void koordinates(int);
int eil=0;
int main()
{
int ilgis;
int aukstis;
char failas[10];
cout<<"---------------------------------------------------------------\n";
cout<<"BMP TO TXT Converter.\n";
cout<<"---------------------------------------------------------------\n";
cout<<"Enter file name with extension.\n";
cout<<"File: ";
cin>>failas;
cout <<"Enter file height and width.\n";
cout<<"Width: ";
cin>>ilgis;
cout<<"Height: ";
cin>>aukstis;
cout<<"---------------------------------------------------------------\n";
cout<<"Converting...\n";
istraukimas(ilgis,aukstis,failas);
cout<<"Reverting...\n";
convertavimas();
cout<<"Copying...\n";
apvertimas(aukstis);
cout<<"Coordinates...\n";
koordinates(aukstis);
cout<<"---------------------------------------------------------------\n";
cout<<"BMP file pixel color codes: BMPcode.txt.\n";
cout<<"BMP to TXT (BGR): result.txt.\n";
cout<<"BMP to TXT (RGB)(Finished): finished_result.txt.\n";
cout<<"Coordinates: coordinates.txt.\n";
cout<<"Good Bye. \n";
cout<<"---------------------------------------------------------------\n";
system("PAUSE>nul");
return 0;
}
void istraukimas(int x, int y, char failo_pav[])
{
FILE* failas;
int nr;
unsigned char data[x][y][3];
string info;
memset(data,0,x*y*3);
BITMAPFILEHEADER bFile;
BITMAPINFOHEADER bInfo;
failas = fopen(failo_pav,"r+");
fseek(failas,0,SEEK_SET);
nr = fread(&bFile,sizeof(BITMAPFILEHEADER),1,failas);
nr = fread(&bInfo,sizeof(BITMAPINFOHEADER),1,failas);
fseek(failas,54,SEEK_SET);
fread(data,x*y*3,1,failas);
ofstream fail("BMPcode.txt");
for(int i=0;i<x;i++)
{
for(int k=0;k<y;k++)
{
cout<<"Converting: "<<i<<" "<<k<<endl;
fail << hex
<< (unsigned short)data[i][k][2]
<< (unsigned short)data[i][k][1]
<< (unsigned short)data[i][k][0]<<endl;
}
fail<<"-"<<endl;
}
fail.close();
fclose(failas);
}
void convertavimas()
{
string eilute;
ifstream failas("BMPcode.txt");
ofstream failas2("result.txt");
while (! failas.eof())
{
getline (failas,eilute);
eil++;
cout<<"Reverting rows: "<<eil<<endl;
if (eilute=="c0c0c0")
failas2<<"1";
else
if (eilute=="ffffff")
failas2<<"2";
else
if (eilute=="ff8040")
failas2<<"3";
else
if (eilute=="-")
failas2<<endl;
else
failas2<<"?";
}
failas.close();
failas2.close();
}
void apvertimas(int aukstis)
{
int eilutes=aukstis;
string eilute[eilutes];
int lin=0;
ifstream failas("result.txt");
while (! failas.eof())
{
if(lin==aukstis) break;
cout<<"Reverting rows: "<<lin<<endl;
getline (failas,eilute[lin++]);
}
failas.close();
ofstream failas2("finished_result.txt");
for (int i=eilutes-1;i>=0;i--)
{
cout<<"Copying rows: "<<i<<endl;
failas2<<eilute[i]<<endl;
}
failas2.close();
}
void koordinates(int aukstis)
{
string buf;
int pirma_eilute=0;
int x=aukstis;
int y=x;
bool rado=false;
int ilgis=0;
int x1,x2,y1,y2;
ifstream failas("finished_result.txt");
while(! failas.eof())
{
cout<<"Searching: "<<pirma_eilute<<endl;;
getline(failas,buf);
pirma_eilute++;
for(int i=0;i<x;i++)
if(buf[i]=='2')
rado=true;
for(int i=0;i<x;i++)
if(buf[i]=='2')
rado=true;
if(rado==true)
break;
}
failas.close();
ifstream failas2("finished_result.txt");
while(! failas.eof())
{
for(int i=1;i<=pirma_eilute;i++)
getline(failas2,buf);
getline(failas2,buf);
for(int i=0;i<x;i++)
{
cout<<"Calculating: "<<i<<endl;;
if(buf[i]=='3')
{
while(buf[i++]=='3')
ilgis++;
break;
}
}
break;
}
failas2.close();
string eilutes[ilgis+4];
int viso_eiluciu = x/(ilgis+4);
int skip=pirma_eilute-2;
int kiek=0;
int laukai=0;
int ratas=0;
int pradinis_skip;
int kel=1;
int ejimai[4]={0,0,0,0};
ofstream out("coordinates.txt");
for(int i=0;i<=viso_eiluciu;i++)
{
ifstream failas3("finished_result.txt");
for(int j=1;j<=skip;j++)
getline(failas3,buf);
while(!failas.eof())
{
cout<<"Generating buf: "<<skip<<endl;
getline(failas3,eilutes[kiek]);
skip++;
if(kiek++==ilgis+3)
break;
}
kiek=0;
if(i==0)
pradinis_skip=skip;
for(int k=0;k<x;k++)
{
cout<<"Making rows: "<<k<<endl;
if(eilutes[2][k]=='3')
{
while(eilutes[2][k++]=='3')
continue;
laukai++;
}
}
int non=0;
int nr=0;
for(int r=0;r<laukai;r++)
{
cout<<"Making Fields: "<<r<<endl;
for(int a=0;a<4;a++)
ejimai[a]=0;
while(eilutes[2][nr++]!='3')
non++;
x1=nr;
x2=x1+ilgis-1;
y1=pradinis_skip-ilgis-1+ratas;
y2=pradinis_skip-2+ratas;
nr+=ilgis;
non+=ilgis;
if((eilutes[1][x1-1]=='2') && (eilutes[0][x1-1]=='2'))
ejimai[0]=1;
if((eilutes[3][x2]=='2') && (eilutes[3][x2+1]=='2'))
ejimai[1]=1;
if((eilutes[ilgis+2][x1-1]=='2') && (eilutes[ilgis+3][x1-1]=='2'))
ejimai[2]=1;
if((eilutes[2][x1-2]=='2') && (eilutes[2][x1-3]=='2'))
ejimai[3]=1;
out<<x1<<","<<x2<<","<<y1<<","<<y2<<","
<<ejimai[0]<<","<<ejimai[1]<<","
<<ejimai[2]<<","<<ejimai[3]<<endl;
}
laukai=0;
ratas+=ilgis+2;
skip-=2;
failas3.close();
}
out.close();
cout<<"Generated.\n";
}