通用图象文件读取类

// ---------------------------------------------------------------------------------------------
typedef  struct  my_error_mgr  {
    
struct jpeg_error_mgr pub;
    jmp_buf setjmp_buffer;
}
  * my_error_ptr;

METHODDEF 
void  my_error_exit (j_common_ptr cinfo)  {
    my_error_ptr myerr 
= (my_error_ptr) cinfo->err;
    longjmp(myerr
->setjmp_buffer, 1);
}


// Number of simultaneous live strings.
// Libtiff uses a large number of strings simultaneously in a dialog, so this method 
// was modified so that it iterates through a different number of buffers.

#define  TIF_MAX_STRINGS            4
#define  TIF_MAX_STRING_SIZE        256

// Declare this function as extern "C" so that the libtiff stuff can hook into it.

extern   " C "  TCHAR  * GetString( int  id)
{
    
static int bufPos=0;
    
static TCHAR buf[TIF_MAX_STRING_SIZE*TIF_MAX_STRINGS];
    TCHAR
* ret;

    
if( LoadString(NULL, id, buf+bufPos, TIF_MAX_STRING_SIZE) ) {
        ret 
= buf+bufPos;
        bufPos 
+= TIF_MAX_STRING_SIZE;
        
if( bufPos >= TIF_MAX_STRINGS*TIF_MAX_STRING_SIZE ) bufPos = 0;
        
return ret;
    }

    
return NULL;
}

// ---------------------------------------------------------------------------------------------
void  Eclinse::getExt(std:: string   &  name)
{
    
int    pos;
    
if( (pos = (int) name.find_last_of('.')) != name.npos ) {
        
int    count = (int) name.length() - pos;
        
if( count > 5 )
            count 
= 5;
        name 
= name.substr( pos, count );
        
if( name[name.length() - 1== '\\' )
            name 
= name.substr( 0, name.length() - 1 );
    }

}

// ---------------------------------------------------------------------------------------------
ImageFile::ImageFile()
{
    fp            
= NULL;
    width        
= 0;
    height        
= 0;
    width1        
= 0;
    height1        
= 0;
    component    
= 0;
    ypos        
= 0;
}

// ---------------------------------------------------------------------------------------------
ImageFile:: ~ ImageFile()
{
}

// ---------------------------------------------------------------------------------------------
int  ImageFile::GetWidth()  const
{
    
return width;
}

// ---------------------------------------------------------------------------------------------
int  ImageFile::GetHeight()  const
{
    
return height;
}

// ---------------------------------------------------------------------------------------------
int  ImageFile::GetComponent()  const
{
    
return component;
}

// ---------------------------------------------------------------------------------------------
RAWImageFile::RAWImageFile()
{
    wb    
= 0;
}

// ---------------------------------------------------------------------------------------------
RAWImageFile:: ~ RAWImageFile()
{
    Close();
}

// ---------------------------------------------------------------------------------------------
bool  RAWImageFile::GetInfo( const   char   * name,  int   &  w,  int   &  h,  int   &  c)
{
    Close();

    
if( (fp = fopen( name, "rb" )) == NULL )
        
return false;

    fread( 
&w, sizeof(int), 1, fp );
    fread( 
&h, sizeof(int), 1, fp );
    fread( 
&c, sizeof(int), 1, fp );

    Close();
    
return true;
}

// ---------------------------------------------------------------------------------------------
bool  RAWImageFile::Load( const   char   * name)
{
    Close();

    
if( (fp = fopen( name, "rb" )) == NULL )
        
return false;

    fread( 
&width, sizeof(int), 1, fp );
    fread( 
&height, sizeof(int), 1, fp );
    fread( 
&component, sizeof(int), 1, fp );

    
if( component != 3 && component != 4 )
        
return false;

    width1        
= width - 1;
    height1        
= height - 1;
    ypos        
= 0;
    wb            
= width * component;
    
    
return true;
}

// ---------------------------------------------------------------------------------------------
void  RAWImageFile::Close()
{
    
if( fp != NULL ) {
        fclose( fp );
        fp 
= NULL;
    }

}

// ---------------------------------------------------------------------------------------------
bool  RAWImageFile::MoveToLine( int  y)
{
    
if( fp == NULL || y < 0 || y >= height )
        
return false;
    fseek( fp, y 
* wb, SEEK_SET );
    ypos 
= y;
    
return true;
}

// ---------------------------------------------------------------------------------------------
bool  RAWImageFile::MoveToNextLine()
{
    
if( fp == NULL || ypos == height1 )
        
return false;
    fseek( fp, wb, SEEK_CUR );
    
++ ypos;
    
return true;
}

// ---------------------------------------------------------------------------------------------
void  RAWImageFile::FormatSubLine(BYTE  * BGRbuf, BYTE  * Abuf,  int  x1,  int  x2)
{
    
if( fp == NULL )
        
return;
    fseek( fp, x1 
* component, SEEK_CUR );
    
if( component == 3 ) {
        fread( BGRbuf, (x2 
- x1) * component, 1, fp );
    }
 else if( component == 4 ) {
        
for(int i = x1; i < x2; ++i) {
            fread( BGRbuf, 
31, fp );
            fread( Abuf, 
11, fp );
            BGRbuf 
+= 3;
            
++ Abuf;
        }

    }

    fseek( fp, 
- x2 * component, SEEK_CUR );
}

// ---------------------------------------------------------------------------------------------
BMPImageFile::BMPImageFile()
{
    wb    
= 0;
}

// ---------------------------------------------------------------------------------------------
BMPImageFile:: ~ BMPImageFile()
{
    Close();
}

// ---------------------------------------------------------------------------------------------
bool  BMPImageFile::GetInfo( const   char   * name,  int   &  w,  int   &  h,  int   &  c)
{
    Close();

    
if( (fp = fopen( name, "rb" )) == NULL )
        
return false;

    BITMAPFILEHEADER    bfhHeader;

    fread( 
&bfhHeader, sizeof(BITMAPFILEHEADER), 1, fp );

    
if( bfhHeader.bfType != 0x4d42 ) {
        fclose( fp );
        
return false;
    }


    UINT    uBmpInfoLen 
= (UINT) bfhHeader.bfOffBits - sizeof(BITMAPFILEHEADER);

    LPBITMAPINFOHEADER    m_lpBMPHdr 
= (LPBITMAPINFOHEADER) new BYTE [ uBmpInfoLen ];

    fread( m_lpBMPHdr, uBmpInfoLen, 
1, fp );

    
if( m_lpBMPHdr->biSize != sizeof(BITMAPINFOHEADER) ||
        m_lpBMPHdr
->biBitCount != 24 ||
        m_lpBMPHdr
->biCompression != BI_RGB ) {
        delete [] m_lpBMPHdr;
        fclose( fp );
        
return false;
    }


    w 
= m_lpBMPHdr->biWidth;
    h 
= m_lpBMPHdr->biHeight;
    c 
= 4;

    delete [] m_lpBMPHdr;

    Close();
    
return true;
}

// ---------------------------------------------------------------------------------------------
bool  BMPImageFile::Load( const   char   * name)
{
    Close();

    
if( (fp = fopen( name, "rb" )) == NULL )
        
return false;

    BITMAPFILEHEADER    bfhHeader;

    fread( 
&bfhHeader, sizeof(BITMAPFILEHEADER), 1, fp );

    
if( bfhHeader.bfType != 0x4d42 ) {
        fclose( fp );
        
return false;
    }


    UINT    uBmpInfoLen 
= (UINT) bfhHeader.bfOffBits - sizeof(BITMAPFILEHEADER);

    LPBITMAPINFOHEADER    m_lpBMPHdr 
= (LPBITMAPINFOHEADER) new BYTE [ uBmpInfoLen ];

    fread( m_lpBMPHdr, uBmpInfoLen, 
1, fp );

    
if( m_lpBMPHdr->biSize != sizeof(BITMAPINFOHEADER) ||
        m_lpBMPHdr
->biBitCount != 24 ||
        m_lpBMPHdr
->biCompression != BI_RGB ) {
        delete [] m_lpBMPHdr;
        fclose( fp );
        
return false;
    }


    width        
= m_lpBMPHdr->biWidth;
    height        
= m_lpBMPHdr->biHeight;
    component    
= 3;
    width1        
= width - 1;
    height1        
= height - 1;
    ypos        
= height1;
    wb            
= (width * 3 + 3& ~3;

    delete [] m_lpBMPHdr;

    
return true;
}

// ---------------------------------------------------------------------------------------------
void  BMPImageFile::Close()
{
    
if( fp != NULL ) {
        fclose( fp );
        fp 
= NULL;
    }

}

// ---------------------------------------------------------------------------------------------
bool  BMPImageFile::MoveToLine( int  y)
{
    
if( fp == NULL || y < 0 || y >= height )
        
return false;
    fseek( fp, 
0, SEEK_END );
    fseek( fp, 
- wb * (y + 1), SEEK_CUR );
    ypos 
= y;
    
return true;
}

// ---------------------------------------------------------------------------------------------
bool  BMPImageFile::MoveToNextLine()
{
    
if( fp == NULL || ypos == height1 )
        
return false;
    fseek( fp, 
- wb, SEEK_CUR );
    
++ ypos;
    
return true;
}

// ---------------------------------------------------------------------------------------------
void  BMPImageFile::FormatSubLine(BYTE  * BGRbuf, BYTE  * Abuf,  int  x1,  int  x2)
{
    
if( fp == NULL )
        
return;
    fseek( fp, x1 
* component, SEEK_CUR );
    fread( BGRbuf, (x2 
- x1) * component, 1, fp );
    fseek( fp, 
- x2 * component, SEEK_CUR );
}

// ---------------------------------------------------------------------------------------------
JPGImageFile::JPGImageFile()
{
}

// ---------------------------------------------------------------------------------------------
JPGImageFile:: ~ JPGImageFile()
{
    Close();
}

// ---------------------------------------------------------------------------------------------
bool  JPGImageFile::GetInfo( const   char   * name,  int   &  w,  int   &  h,  int   &  c)
{
    Close();

    
if( (fp = fopen( name, "rb" ) ) == NULL )
        
return false;

    
struct jpeg_decompress_struct    cinfo;
    
struct my_error_mgr                jerr;

    cinfo.err 
= jpeg_std_error( &jerr.pub );
    jerr.pub.error_exit 
= my_error_exit;

    
if( setjmp(jerr.setjmp_buffer) ) {
        jpeg_destroy_decompress( 
&cinfo );
        
return false;
    }


    jpeg_create_decompress( 
&cinfo );
    jpeg_stdio_src( 
&cinfo, fp );

    jpeg_read_header( 
&cinfo, TRUE );
    jpeg_start_decompress( 
&cinfo );

    
if( cinfo.num_components != 3 && cinfo.num_components != 4 )
        
return false;

    w 
= cinfo.output_width;
    h 
= cinfo.output_height;
    c 
= cinfo.num_components;

    jpeg_destroy_decompress( 
&cinfo );

    Close();
    
return true;
}

// ---------------------------------------------------------------------------------------------
bool  JPGImageFile::Load( const   char   * name)
{
    Close();

    
if( (fp = fopen( name, "rb" ) ) == NULL )
        
return false;

    
struct jpeg_decompress_struct    cinfo;
    
struct my_error_mgr                jerr;
    JSAMPARRAY                        buffer;
    
int                                row_stride;
    FILE                            
*tmpf = NULL;

    cinfo.err 
= jpeg_std_error( &jerr.pub );
    jerr.pub.error_exit 
= my_error_exit;

    
if( setjmp(jerr.setjmp_buffer) ) {
        jpeg_destroy_decompress( 
&cinfo );
        
return false;
    }


    jpeg_create_decompress( 
&cinfo );
    jpeg_stdio_src( 
&cinfo, fp );

    jpeg_read_header( 
&cinfo, TRUE );
    jpeg_start_decompress( 
&cinfo );

    
if( cinfo.num_components != 3 && cinfo.num_components != 4 )
        
return false;

    width        
= cinfo.output_width;
    height        
= cinfo.output_height;
    component    
= cinfo.num_components;
    width1        
= width - 1;
    height1        
= height - 1;
    ypos        
= 0;
    row_stride    
= width * component;

    buffer 
= (*cinfo.mem->alloc_sarray)
                ((j_common_ptr) 
&cinfo, JPOOL_IMAGE, row_stride, 1);

    tmpnam( tmpf_name );
    
    
if( (tmpf = fopen(tmpf_name, "wb")) == NULL ) {
        jpeg_destroy_decompress( 
&cinfo );
        
return false;
    }


    fwrite( 
&width, sizeof(int), 1, tmpf );
    fwrite( 
&height, sizeof(int), 1, tmpf );
    fwrite( 
&component, sizeof(int), 1, tmpf );

    
while( cinfo.output_scanline < cinfo.output_height ) {
        jpeg_read_scanlines( 
&cinfo, buffer, 1 );
        BYTE    
*ptr = buffer[0];
        
if( component == 3 ) {
            
for(int i = 0; i < width; ++i) {
                fwrite( ptr 
+ 211, tmpf );
                fwrite( ptr 
+ 111, tmpf );
                fwrite( ptr 
+ 011, tmpf );
                ptr 
+= component;
            }

        }
 else if( component == 4 ) {
            
for(int i = 0; i < width; ++i) {
                fwrite( ptr 
+ 211, tmpf );
                fwrite( ptr 
+ 111, tmpf );
                fwrite( ptr 
+ 011, tmpf );
                fwrite( ptr 
+ 311, tmpf );
                ptr 
+= component;
            }

        }

    }
;

    fclose( tmpf );

    jpeg_finish_decompress( 
&cinfo );
    jpeg_destroy_decompress( 
&cinfo );

    raw.Load( tmpf_name );

    
return true;
}

// ---------------------------------------------------------------------------------------------
void  JPGImageFile::Close()
{
    
if( fp != NULL ) {
        fclose( fp );
        fp 
= NULL;
    }

    raw.Close();
    remove( tmpf_name );
}

// ---------------------------------------------------------------------------------------------
bool  JPGImageFile::MoveToLine( int  y)
{
    
return raw.MoveToLine( y );
}

// ---------------------------------------------------------------------------------------------
bool  JPGImageFile::MoveToNextLine()
{
    
return raw.MoveToNextLine();
}

// ---------------------------------------------------------------------------------------------
void  JPGImageFile::FormatSubLine(BYTE  * BGRbuf, BYTE  * Abuf,  int  x1,  int  x2)
{
    raw.FormatSubLine( BGRbuf, Abuf, x1, x2 );
}

// ---------------------------------------------------------------------------------------------
TIFImageFile::TIFImageFile()
{
    tif        
= NULL;
    td        
= NULL;
    loadbuf    
= NULL;
}

// ---------------------------------------------------------------------------------------------
TIFImageFile:: ~ TIFImageFile()
{
    Close();
}

// ---------------------------------------------------------------------------------------------
bool  TIFImageFile::GetInfo( const   char   * name,  int   &  w,  int   &  h,  int   &  c)
{
    Close();

    
if( (tif = TIFFOpen( name, _T("r") )) == NULL )
        
return false;

    td 
= &tif->tif_dir;

    
if( td->td_photometric != PHOTOMETRIC_RGB ||
        (td
->td_samplesperpixel != 3 && td->td_samplesperpixel != 4||
        td
->td_bitspersample != 8 )
        
return false;

    w 
= td->td_imagewidth;
    h 
= td->td_imagelength;
    c 
= td->td_samplesperpixel;

    Close();
    
return true;
}

// ---------------------------------------------------------------------------------------------
bool  TIFImageFile::Load( const   char   * name)
{
    Close();

    
if( (tif = TIFFOpen( name, _T("r") )) == NULL )
        
return false;

    td 
= &tif->tif_dir;

    
if( td->td_photometric != PHOTOMETRIC_RGB ||
        (td
->td_samplesperpixel != 3 && td->td_samplesperpixel != 4||
        td
->td_bitspersample != 8 )
        
return false;

    width        
= td->td_imagewidth;
    height        
= td->td_imagelength;
    component    
= td->td_samplesperpixel;
    width1        
= width - 1;
    height1        
= height - 1;
    ypos        
= 0;
    
    loadbuf 
= new BYTE[ tif->tif_scanlinesize ];

    
return true;
}

// ---------------------------------------------------------------------------------------------
void  TIFImageFile::Close()
{
    
if( tif != NULL ) {
        TIFFClose( tif );
        tif    
= NULL;
        td    
= NULL;
    }

    
if( loadbuf != NULL ) {
        delete [] loadbuf;
        loadbuf 
= NULL;
    }

}

// ---------------------------------------------------------------------------------------------
bool  TIFImageFile::MoveToLine( int  y)
{
    
if( tif == NULL || y < 0 || y >= height )
        
return false;
    ypos 
= y;
    
return true;
}

// ---------------------------------------------------------------------------------------------
bool  TIFImageFile::MoveToNextLine()
{
    
if( tif == NULL || ypos == height1 )
        
return false;
    
++ ypos;
    
return true;
}

// ---------------------------------------------------------------------------------------------
void  TIFImageFile::FormatSubLine(BYTE  * BGRbuf, BYTE  * Abuf,  int  x1,  int  x2)
{
    
if( tif == NULL )
        
return;
    BYTE    
*dst, *ptr;
    
if( td->td_planarconfig == PLANARCONFIG_SEPARATE ) {
        
for(int i = 0; i < 3++i) {
            TIFFReadScanline( tif, loadbuf, ypos, 
2 - i );
            dst 
= BGRbuf + i,
            ptr 
= loadbuf + x1;
            
for(int x = x1; x < x2; ++x) {
                dst[
0= ptr[0];
                dst 
+= 3;
                
++ ptr;
            }

        }

        
if( component == 4 ) {
            TIFFReadScanline( tif, loadbuf, ypos, 
3 );
            dst 
= Abuf;
            ptr 
= loadbuf + x1;
            
for(int x = x1; x < x2; ++x) {
                dst[
0= ptr[0];
                
++ dst;
                
++ ptr;
            }

        }

    }
 else {
        TIFFReadScanline( tif, loadbuf, ypos, 
0 );
        ptr 
= loadbuf + x1 * component;
        
if( component == 3 ) {
            
for(int i = x1; i < x2; ++i) {
                BGRbuf[
0]    = ptr[2];
                BGRbuf[
1]    = ptr[1];
                BGRbuf[
2]    = ptr[0];
                BGRbuf 
+= 3;
                ptr 
+= component;
            }

        }
 else if( component == 4 ) {
            
for(int i = x1; i < x2; ++i) {
                BGRbuf[
0]    = ptr[2];
                BGRbuf[
1]    = ptr[1];
                BGRbuf[
2]    = ptr[0];
                Abuf[
0]        = ptr[3];
                BGRbuf 
+= 3;
                
++ Abuf;
                ptr 
+= component;
            }

        }

    }

}

// ---------------------------------------------------------------------------------------------

你可能感兴趣的:(文件读取)