AnsiString FileName;
byte *data;//law data
FILE *fp;
// argument of FileHeader
byte *FileHeader = new byte[14];
char type[2];
short int reserved1,reserved2;
int size,offset;
// argument of InfoHeader
// XPPM is XPelPerMeter, YPPM is YPelPerMeter,
// ClrU is ClrUsed , ClrI is Clrimportant
byte *InfoHeader = new byte[40];
short int planes,bitcount;
int bisize,width,height,compression,sizeimage,XPPM,YPPM,ClrU,ClrI;
// argument of show image
int i,j,W,H,Y ;
int B,G,R ;
int k=0;
//main function
if(OpenDialog1->Execute()){
FileName = OpenDialog1->FileName;
}
fp=fopen(FileName.c_str(),"rb");
/*************************************************************
** read Header information, **
** it includes FileHeader(14bytes) and InfoHeader(40bytes)**
*************************************************************/
//read FileHeader information
fread(FileHeader,14,1,fp);
type[0] =FileHeader[0] ;
type[1] =FileHeader[1] ;
size =FileHeader[2] +FileHeader[3]*256+FileHeader[4]*256*256+FileHeader[5]*256*256*256;
reserved1=FileHeader[6] +FileHeader[7]*256;
reserved2=FileHeader[8] +FileHeader[9]*256;
offset =FileHeader[10]+FileHeader[11]*256+FileHeader[12]*256*256+FileHeader[13]*256*256*256 ;
//show FileHeader data
Form1->Label_showType->Caption = type;
Form1->Label_sohwSize->Caption = size;
Form1->Label_showReserved1->Caption =reserved1;
Form1->Label_showReserved2->Caption =reserved2;
Form1->Label_showOffset->Caption =offset;
//read InfoHeader information
fread(InfoHeader,40,1,fp);
bisize =InfoHeader[0]+InfoHeader[1]*256+InfoHeader[2]*256*256+InfoHeader[3]*256*256*256;
width =InfoHeader[4]+InfoHeader[5]*256+InfoHeader[6]*256*256+InfoHeader[7]*256*256*256;
height =InfoHeader[8]+InfoHeader[9]*256+InfoHeader[10]*256*256+InfoHeader[11]*256*256*256;
planes =InfoHeader[12]+InfoHeader[13]*256;
bitcount =InfoHeader[14]+InfoHeader[15]*256;
compression=InfoHeader[16]+InfoHeader[17]*256+InfoHeader[18]*256*256+InfoHeader[19]*256*256*256;
sizeimage =InfoHeader[20]+InfoHeader[21]*256+InfoHeader[22]*256*256+InfoHeader[23]*256*256*256;
XPPM =InfoHeader[24]+InfoHeader[25]*256+InfoHeader[26]*256*256+InfoHeader[27]*256*256*256;
YPPM =InfoHeader[28]+InfoHeader[29]*256+InfoHeader[30]*256*256+InfoHeader[31]*256*256*256;
ClrU =InfoHeader[32]+InfoHeader[33]*256+InfoHeader[34]*256*256+InfoHeader[35]*256*256*256;
ClrI =InfoHeader[36]+InfoHeader[37]*256+InfoHeader[38]*256*256+InfoHeader[39]*256*256*256;
//show InfoHeader data
Form1->Label_showBisize->Caption=bisize;
Form1->Label_showWidth->Caption=width;
Form1->Label_showHeight->Caption=height;
Form1->Label_showPlanes->Caption=planes;
Form1->Label_showBitcount->Caption=bitcount;
Form1->Label_showCompression->Caption=compression;
Form1->Label_showSizeimage->Caption=sizeimage;
Form1->Label_showXPPM->Caption=XPPM;
Form1->Label_showYPPM->Caption=YPPM;
Form1->Label_showClrU->Caption=ClrU;
Form1->Label_showClrI->Caption=ClrI;
data = new byte[sizeimage];//announce law data size
fseek(fp,offset,SEEK_SET);//move fp to the start of law data
//read law data and show image one pixel by one pixel
fread(data,sizeimage,1,fp);
//if the bitmap is color , one pixel is 3 bytes(bitcount is 24)
//if the bitmap os gray , one pixel is 1 byte (bitcount is 8)
if(bitcount==24){
for(i=0;i<sizeimage;i=i+3){
B=data[i];
G=data[i+1];
R=data[i+2];
W=k%width;
H=height-(k/width)-1;
Image_show->Canvas->Pixels[W][H]=R + G*256 + B*256*256;
k++;
}
}
else{
for(i=0;i<sizeimage;i++){
Y=data[i];
W=k%width;
H=height-(k/width)-1;
Image_show->Canvas->Pixels[W][H]=Y + Y*256 + Y*256*256;
k++;
}
}
fclose(fp);
delete FileHeader,InfoHeader,data;