cdib.h
上传用户:piaozanzhu
上传日期:2008-02-14
资源大小:212k
文件大小:4k
源码类别:

图形图像处理

开发平台:

Visual C++

  1. // cdib.h 对CDib类中数据和函数进行进行声明
  2. #ifndef _INSIDE_VISUAL_CPP_CDIB
  3. #define _INSIDE_VISUAL_CPP_CDIB
  4. class CDib : public CObject
  5. {
  6. public:
  7. enum Alloc {noAlloc, crtAlloc, heapAlloc}; // 枚举类型,表示内存分配的状况
  8. DECLARE_SERIAL(CDib)
  9. public:
  10. LPVOID m_lpvColorTable; // 调色板指针
  11. HBITMAP m_hBitmap; // BITMAP结构指针
  12. LPBYTE m_lpImage; // DIB位图数据块地址
  13. LPBITMAPINFOHEADER m_lpBMIH; // DIB信息头指针
  14. HGLOBAL m_hGlobal; // 全局的句柄,用于内存映射文件中                    
  15. Alloc m_nBmihAlloc; // 表示信息头内存分配的状况
  16. Alloc m_nImageAlloc; // 表示位图数据分配的状况
  17. DWORD m_dwSizeImage; // DIB位图中的字节数(信息头和调色板数据除外)
  18. int m_nColorTableEntries; // 调色板表项数
  19. HANDLE m_hFile; // 文件句柄
  20. HANDLE m_hMap; // 内存映射文件句柄
  21. LPVOID m_lpvFile; // 文件句柄
  22. HPALETTE m_hPalette; // 调色板句柄
  23. int Pix_X;
  24. int Pix_Y;
  25. public:
  26. RGBQUAD GetPixel(int x, int y); // 获取象素真实的颜色值
  27. LONG GetPixelOffset(int  x, int y); // 获取象素在图象数据块中的位置
  28. CSize GetDibSaveDim(); // 获取DIB位图数据块的存储尺寸
  29. BOOL IsEmpty(); // 判断DIB是否为空
  30. WORD PaletteSize(); // 计算调色板的表项数
  31. CDib(); // 构造函数
  32. CDib(CSize size, int nBitCount); // 根据指定的位图尺寸和象素位数来构造CDib实例
  33. ~CDib(); // 析构函数
  34. int GetSizeImage() {return m_dwSizeImage;} // 获取DIB位图中数据的字节数
  35. int GetSizeHeader() // 获取信息头和调色板的尺寸
  36. {return sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * m_nColorTableEntries;}
  37. CSize GetDimensions(); // 获取以象素表示的DIB的宽度和高度
  38. // 以读模式打开内存映射文件,并将其与CDib对象进行关联]
  39. BOOL AttachMapFile(const char* strPathname, BOOL bShare = FALSE);
  40. BOOL CopyToMapFile(const char* strPathname); //创建一个新的内存映射文件,并进行数据的复制
  41. // 用内存中的DIB与已有的CDib对象关联
  42. BOOL AttachMemory(LPVOID lpvMem, BOOL bMustDelete = FALSE, HGLOBAL hGlobal = NULL);
  43. // 将CDib对象按照指定的尺寸输出到显示器(或者打印机)
  44. BOOL Draw(CDC* pDC, CPoint origin, CSize size);  // until we implemnt CreateDibSection
  45. // 创建一个DIB短,图象内存将不被初始化
  46. HBITMAP CreateSection(CDC* pDC = NULL);
  47. // 将CDib对象的逻辑调色板选入设备上下文,然后实现该调色板
  48. UINT UsePalette(CDC* pDC, BOOL bBackground = FALSE);
  49. // 如果调色板存在的话,读取调色板,并创建一个Windows调色板
  50. BOOL MakePalette();
  51. // 如果16bpp、24bpp或32bppDIB不举杯调色板,则该函数可以为CDib对象创建一个逻辑调色板,
  52. // 它与由CreatehalftonePalette函数返回的调色板相匹配。如果程序在256色调色板显示器上
  53. // 运行,而你又没有调用SetSystemPalette,那么,你将不具有任何调色板,只有20中标准的
  54. // Windows颜色出现在DIB中
  55.   BOOL SetSystemPalette(CDC* pDC);
  56. // 将DIB重新生成为压缩的或者不压缩的DIB。
  57. BOOL Compress(CDC* pDC, BOOL bCompress = TRUE); 
  58. // 从以后的DIB中创建DDB位图,实现DIB到DDB的转换
  59. HBITMAP CreateBitmap(CDC* pDC);
  60. // 从DDB中创建DIB,实现DDB到DIB的转换
  61. BOOL ConvertFromDDB(HBITMAP hBitmap, HPALETTE hPal);
  62. // 从文件中读取数据,并填充文件头、信息头、调色板和位图数据
  63. BOOL Read(CFile* pFile);
  64. // 从BMP文件中读取信息头,调用CreateDIBSection来分配位图数据内存,然后将位图从该文件读入刚才分配的内存
  65. BOOL ReadSection(CFile* pFile, CDC* pDC = NULL);
  66. // 将DIB从CDib对象写入文件
  67. BOOL Write(CFile* pFile);
  68. // 串行化过程
  69. void Serialize(CArchive& ar);
  70. // 清空DIB,释放已经分配的内存,并且关闭映射文件
  71. void Empty();
  72. // 计算调色板的尺寸
  73. void ComputePaletteSize(int nBitCount);
  74. private:
  75. // 断开映射文件的关联
  76. void DetachMapFile();
  77. // 计算调色板和位图尺寸
  78. void ComputeMetrics();
  79. };
  80. #endif // _INSIDE_VISUAL_CPP_CDIB