下面给出GrFmtReader的结构图:
那么这里再看一下GrFmtReader的类结构:
/ base class for readers
class GrFmtReader
{
public:
GrFmtReader( const char* filename );
virtual ~GrFmtReader();
int GetWidth() { return m_width; };
int GetHeight() { return m_height; };
bool IsColor() { return m_iscolor; };
int GetDepth() { return m_bit_depth; };
void UseNativeDepth( bool yes ) { m_native_depth = yes; }; //设置否用本地的通道数。
bool IsFloat() { return m_isfloat; };
virtual bool ReadHeader() = 0;
virtual bool ReadData( uchar* data, int step, int color ) = 0;
virtual void Close();
protected:
bool m_iscolor;
int m_width; // 图像的宽度,被ReadHeader()设置。
int m_height; // 图像的高度,被ReadHeader()设置。
int m_bit_depth;// 每一个通道中的位数,一般而言是8位,很明显,也有不是的。
char m_filename[_MAX_PATH]; // 要读取的文件名及位置。注意最长长度。为什么不用string?
bool m_native_depth;//用图片本身的通道数
bool m_isfloat; //这个图片是用float or double?
};
这个类的其他函数都没有做什么,只是设置了一些数据:代码如下:这里不再具体进行设计:
view plaincopy to clipboardprint?
GrFmtReader::GrFmtReader( const char* filename )
{
strncpy( m_filename, filename, sizeof(m_filename) - 1 );
m_filename[sizeof(m_filename)-1] = '/0';
m_width = m_height = 0;
m_iscolor = false;
m_bit_depth = 8;
m_native_depth = false;
m_isfloat = false;
}
GrFmtReader::~GrFmtReader()
{
Close();
}
void GrFmtReader::Close()
{
m_width = m_height = 0;
m_iscolor = false;
}
实际应该可以看出,这个函数本身只放了一些存取数据的函数在这里,本身最关键的函数是没有放在这里。应该是与具体的读哪个图片是有关系的。那么当我们读BMP图片的时候,用的就是GrFmtBmpReader这个读取器。接下来看一下这个读取器。

再看一下这个类的内部构造。
view plaincopy to clipboardprint?
class GrFmtBmpReader : public GrFmtReader
{
public:
GrFmtBmpReader( const char* filename );
~GrFmtBmpReader();
bool ReadData( uchar* data, int step, int color ); //取读数据。
bool ReadHeader();//读取文件头。
void Close();
protected:
RLByteStream m_strm;//流读取器。
PaletteEntry m_palette[256];//调色板
int m_bpp;//?
int m_offset;//?
BmpCompression m_rle_code;//压缩编码
};