www.pudn.com > buildct.zip > BmpRead.cpp, change:2004-02-22,size:3262b


// BmpRead.cpp: implementation of the CBmpRead class. 
// 
////////////////////////////////////////////////////////////////////// 
 
#include "stdafx.h" 
#include "buildct.h" 
#include "BmpRead.h" 
 
#ifdef _DEBUG 
#undef THIS_FILE 
static char THIS_FILE[]=__FILE__; 
#define new DEBUG_NEW 
#endif 
 
////////////////////////////////////////////////////////////////////// 
// Construction/Destruction 
////////////////////////////////////////////////////////////////////// 
 
CBmpRead::CBmpRead() 
{ 
 
} 
 
CBmpRead::~CBmpRead() 
{ 
 
} 
 
 
int CBmpRead::bytes_Line(BITMAPINFOHEADER bmiHeader) 
{ 
    int n; 
 
    n=bmiHeader.biWidth*bmiHeader.biBitCount; 
    n=((n+31)/32)*4; 
    return n; 
} 
 
 
/* 处理一行*/ 
void CBmpRead::out_Line(char   *ptr,FILE * outfile,int biWidth) 
{ 
 
	BYTE bit[8]={128, 64, 32, 16, 8, 4, 2, 1}; 
 
    if(outfile==NULL)return; 
    int i, j; 
    char *line=(char  *)malloc(biWidth+1); 
    for(j=0,i=0; j<8,i<biWidth; j++,i++) 
    { 
        int bt0=((ptr[i/8] & bit[j])!=0)?1:0; 
        *(line+i)=bt0; 
    } 
 
    //filter(line); 
    for(i=0; i<biWidth; i++) 
    { 
        fprintf(outfile,"%1d ",*(line+i)); 
    } 
    fprintf(outfile,"\n"); 
    free(line); 
 
} 
 
/*读入一幅断层扫描图*/ 
 
int CBmpRead::readImage(char *inname,char *outname , unsigned char buffer[][IMAGEW/8]) 
{ 
    BITMAPFILEHEADER bmfHeader; 
	BITMAPINFOHEADER bmiHeader; 
	RGBQUAD *bmiColor=new RGBQUAD(); 
 
    int nColors=1, bytes_line, i,j; 
    char   *ptr; 
    int re=0; 
    //char outname[]="dt.tst"; 
    FILE  *infile,*outfile; 
 
 
    infile=fopen(inname,"rb"); 
    if(infile==NULL) 
    { 
        printf("Open bit bitmap file failed!"); 
        re=-1; 
        return -1; 
    } 
    outfile=NULL; 
    if(outname!=NULL) 
    { 
        //printf("open out file ignored!"); 
        //outname=""; 
        outfile=fopen(outname,"wt"); 
    } 
     
     
    fread(&bmfHeader, sizeof(bmfHeader), 1, infile); 
    fread(&bmiHeader, sizeof(bmiHeader), 1, infile); 
 
    if(bmiHeader.biBitCount!=1 ) 
    { 
        printf("位图不是黑白的 或大小不符合(512*512),w=%d,h=%d\n",bmiHeader.biWidth,bmiHeader.biHeight); 
        fclose(infile); 
        if(outfile!=NULL) fclose(outfile); 
        return -2; 
    } 
    //printf("Image width: %d  height: %d \n",bmiHeader.biWidth,bmiHeader.biHeight); 
 
    fread(bmiColor, sizeof(RGBQUAD), nColors, infile); 
    bytes_line=bytes_Line(bmiHeader); 
    ptr=(char  *)malloc(bytes_line); 
 
    fseek(infile, bmfHeader.bfOffBits , SEEK_SET); 
 
    for(i=0; i<bmiHeader.biHeight; i++) 
    { 
        fread(ptr,bytes_line, 1, infile); 
        if(outfile!=NULL)out_Line(ptr,outfile,bmiHeader.biWidth); 
        /* 
        for(j=0,i=0; j<8,i<bmiHeader.biWidth; j++,i++) 
        { 
            int bt0=(ptr[i/8]&bit[j]!=0)?1:0; 
            //*(line+i)=bt0; 
            buffer[i][j]=bt0; 
        } 
        //printf("eee\n"); 
        */ 
        for(j=0;j<bmiHeader.biWidth/8;j++) 
        { 
        //if(ptr[j]!=0)printf("ptr=%d\n",ptr[j]); 
          buffer[i][j]=ptr[j]; 
        //if(buffer[i][j]!=0)printf("val=%d\n",buffer[i][j]); 
        } 
         
    } 
    //printf("end!\n"); 
    fclose(infile); 
    if(outfile!=NULL) 
    fclose(outfile); 
    return re; 
}