www.pudn.com > 医学图像处理示例源代码.rar > Image.h


 
#ifndef _IMAGE_H 
#define _IMAGE_H 
 
#define DIB_HEADER_MARKER         ((WORD)('M'<<8)|'B')    // define "BM" 
#define PALVERSION                0x300                   // Windows version   
#define WIDTHBYTES(bits)          (((bits)+31) / 32*4)    // 求图像表面跨距 
#define COLORCOUNT                256                     // 索引图像颜色数. 
#define IMG_FORMAT_BASE_LENGTH    256                     // *.IMG图像格式的长度基 
#define MAXIMGSIZE                2048                    // *.IMG图像格式最大长度 
#define REDCOMPONENT              0x1                     // 定义红色分量 
#define GREENCOMPONENT            0x10                    // 定义绿色分量 
#define BLUECOMPONENT             0x100                   // 定义蓝色分量 
#define HUEIMAGE                  0x1000                  // 定义亮度分量 
#define SATURATIONIMAGE           0x10000                 // 定义亮度分量 
#define INTENSITYIMAGE            0x100000                  // 定义亮度分量 
 
typedef unsigned char             P_BYTE; 
typedef long                      P_LONG; 
 
class FloatImage 
{ 
public: 
	float *  lp_data; 
	float ** lp_AddRow; 
	unsigned int Width;   // x indices range from 0 .. width-1 
	unsigned int Height;  // y indices range from 0 .. height-1	 
	unsigned int ImageSize; 
public: 
	FloatImage(); 
	~FloatImage(); 
	FloatImage(unsigned int w, unsigned int h); 
	void Construct(unsigned int w, unsigned int h); 
	void DeleteData(); 
}; 
 
enum eImageType  
{  
	IllegalImage,     // 非法图像文件 
	BinaryImage ,     // 定义二值图像  
	FourBitsImage,    // 定义4位彩色值图像 
	IndexColorImage,  // 定义8位彩色图像 
	IndexGrayImage,   // 定义8位灰度图像 
	HighColorImage,   // 定义16位彩色图像 
	TrueColorImage,   // 定义24位彩色图像 
	UltraColorImage   // 定义32位彩色图像 
}; 
 
class C2DArray : public CObject  
{ 
public: 
    P_LONG            m_nDibWidth;      // 数据的宽度 
    P_LONG            m_nDibHeight;  	// 数据的高度 
    P_BYTE           *m_lpDibArray;     // 数据的指针 
	P_BYTE          **RowAddress; 
public: 
    C2DArray(); 
    C2DArray(P_LONG width, P_LONG height); 
    virtual ~C2DArray(); 
 
	P_BYTE  SGetXYValue(P_LONG x, P_LONG y);   	            // 获得数据	 
	P_BYTE  SGetXYValue(  CPoint pt   );	                // 获得数据 
	void    SSetXYValue(P_LONG x, P_LONG y, P_BYTE value);  // 设置数据 
	void    SSetXYValue(   CPoint pt,       P_BYTE value);  // 设置数据 
  
    P_LONG  GetDataWidth()  { return m_nDibWidth;  };    // 获得数据的宽度 
    P_LONG  GetDataHeight() { return m_nDibHeight; };    // 获得数据的高度 
	BOOL    CheckDataRange(P_LONG x, P_LONG y);          // 检验点的有效性 
	BOOL    CheckDataRange(   CPoint pt    );            // 检验点的有效性 
 
	void    ReleaseDibArray();                           // 释放m_lpDibArray内存 
}; 
class CImage : public C2DArray  
{ 
public:  //attribute 
	int				m_SorceType; 
	int             m_Bright; 
	int             m_Contrast; 
	WORD            m_wImageDepth;	         // 图像的像素深度 =1, 4,    8,  16,  24, 32 
    WORD            m_wColorMapNum;          // 调色板的数目   =2, 16, 256,   0,   0,  0    
	 
	DWORD           m_dwRBitMask;		     // R的掩码  (方便处理16及32位图像) 
	DWORD           m_dwGBitMask;			 // G的掩码  (方便处理16及32位图像) 
	DWORD           m_dwBBitMask;			 // B的掩码  (方便处理16及32位图像) 
 
	WORD            m_wlowRedBit;			 // R的最低位 (方便处理16及32位图像) 
	WORD            m_wlowGreenBit;			 // G的最低位 (方便处理16及32位图像) 
	WORD			m_wlowBlueBit;			 // B的最低位 (方便处理16及32位图像) 
 
	WORD	        m_wNumRedBits;			 // R的位数  (方便处理16及32位图像) 
	WORD            m_wNumGreenBits;		 // G的位数  (方便处理16及32位图像) 
	WORD			m_wNumBlueBits;			 // B的位数  (方便处理16及32位图像) 
	BOOL            m_IsExistRGBMask;        // 是否存在RGB掩码 
	BOOL            m_Is565RGBImage;         // 是否是565格式的16位图像 
	P_LONG  		m_ImageSize;			 // 图像的大小  
    P_LONG          m_ImageWidth;			 // 图像的宽度 
	P_LONG          m_ImageHeight;			 // 图像的高度 
 
	P_LONG          m_HSIImageWidth;		 // 亮度分量图像的宽度  
    P_LONG          m_HSIImageHeight;		 // 亮度分量图像的高度 
 
	double          m_fScale;				 // 图像的显示比例 
	BOOL            m_bImgModified;			 // 图像是否被修改的标记 
	BOOL            m_IsImageDownUp;         // 图像是否上下颠倒 
 
    P_BYTE         *m_lpDibArrayBuff;        // 备份图像数据的指针 
	P_BYTE	       *m_lpHSIArray;            // 亮度分量图像数据的指针 
 
   	BITMAPFILEHEADER    m_bmfHeader;         // 位图的头 
    LPBITMAPINFO        m_lpDibInfo;         // 图像的信息 
	P_BYTE             *m_pUseful;           // 图像的信息内存 
    RGBTRIPLE           ColorIndex[256];     // 备份索引图像调色板 
public:	 
    CImage();             // 类的构造及析构函数 
    CImage(CImage & source); 
    CImage(P_LONG width, P_LONG height, int PixelDepth,DWORD colornum); 
    CImage(CImage &source,CPoint <p, CPoint &RBp);   
	 
	// 对产生的部分图像处理的函数 
	BOOL CreateEmpty(P_LONG width, P_LONG height,int PixelDepth,DWORD colornum); 
    BOOL CreatePartImg(CImage &source, CPoint <p, CPoint &RBp, int nScale=1);	 
	BOOL CreateMicroImg(CImage &source, P_LONG MicroW, P_LONG MicroH);	 
 
	virtual ~CImage();    // destructor : free memory of  m_hDib and delete m_palDIB 
  
    //Read or save image from or to a file   
    virtual BOOL ReadImageFromFile(LPCTSTR lpszFileName); 
    virtual BOOL SaveImageToFile(LPCTSTR lpszFileName); 
 
	BOOL ReadImageAsBMP(CFile * pReadFile);   //读取BMP图像 
    BOOL ReadImageAsIMG(CFile * pReadFile);   //读取IMG图像  
 
	BOOL SaveImageAsBMP(CFile * pSaveFile);   //保存IMG图像  
    BOOL SaveImageAsIMG(CFile * pSaveFile);	  //保存IMG图像	 
    // 图像的显示函数 
    BOOL ShowCurrentImage(CDC *pMpDc,CRect ShowRect); 
    BOOL ShowCurrentImage(CDC *pMpDc,CPoint LTp, CPoint RBp); 
    BOOL ShowCurrentImage(CDC *pMpDc,int x1, int y1, int x2, int y2); 
	BOOL ShowPartialImage(CDC *pMpDc,CRect ShowRect,CPoint LTp,CPoint RBp, BOOL Is1to1=false); 
 
	// 获得图像信息的函数 
	eImageType  GetImageType();                        // 获得图像的类型 
	WORD        GetColorMapNum(int Depth);	           // 调色板的数目 
    void        SelectChannel(DWORD channel);          // 选择颜色的显示分量 
 
    P_LONG      GetImageWidth()						   // 获得图像的宽度 
				{ return m_ImageWidth;    };  
    P_LONG      GetImageHeight()			           // 获得图像的高度 
				{ return m_ImageHeight;   }; 
    WORD        GetImageDepth()					       // 获得图像的深度 
				{ return m_wImageDepth; }; 
    double      GetShowScale()					       // 获得图像的显示比例 
				{ return m_fScale;         }; 
    void        SetShowScale(double scale)			   // 设置图像的显示比例 
				{ m_fScale = scale;        };  
	void        GetImageDimensions(LPCTSTR fileName,  
		                         unsigned int &width,  
				                 unsigned int &height,  
								 unsigned int &Depth); 
 
	// 获得或设置图像灰度值的函数 
    P_BYTE      GetGrayV(     P_LONG x, P_LONG y);     // 获得灰度图像的灰度值 
	P_BYTE      GetGrayV(     double x, double y);     // 获得灰度图像的灰度值 
	P_BYTE      GetXYHueValue(P_LONG x, P_LONG y);     // 获得亮度图像的亮度值 
	RGBTRIPLE   GetRGBPixel(  P_LONG x, P_LONG y);     // 获得彩色图像的RGB值 
 
    void        SetRGBPixel(P_LONG x, P_LONG y,RGBTRIPLE color); // 设置彩色图像的RGB值 
    void        SetRGBPixel(P_LONG x, P_LONG y,DWORD color);     // 设置彩色图像的RGB值 
    void        SetGrayV(   P_LONG x, P_LONG y,P_BYTE gray);     // 设置灰度图像的灰度值 
 
	// 一些处理时有用的函数 
	void   BackUp();		  // bakup image data. 
	void   ImgSwap();		  // swap image with bakup image. 
	BOOL   BakupColorIndex(); // bakup index image color table data. 
 
    void   Inverse();                        // 正负片的显示                        
    void   ImageInfo();                      // 显示图像信息的函数 
	void   VerticalFlip();                   // 竖直翻转图像 
	void   HorizontalFlip();                 // 水平翻转图像 
	void   Rotate90(BOOL Clockwise=TRUE);    // 90.翻转图像   
 
	BOOL   CheckPoint(P_LONG &x, P_LONG &y);  // 检验点的有效性 
	BOOL   CheckPoint(CPoint &pt);            // 检验点的有效性 
	BOOL   CheckRect(CPoint &p1,CPoint &p2);  // 检验区域的有效性 
	BOOL   CheckRect(CRect &ImageRect);        // 检验区域的有效性 
   	void   CreateHSIImage(DWORD dwType);      // transfer to HSI data 
 
	BOOL   ConvertToGrayImage(); 
	void   GenerateRowAddress(); 
	//用来向剪贴板提供数据句柄的函数,用后最好用ReleaseCopyHandle()释放内存 
	HANDLE   m_hDIB;  	              // handle of transfer  image to clipboard 
    HANDLE   GetCopyHandle(CPoint LTp, CPoint RBp); 
	void     ReleaseCopyHandle();     // 释放m_hDIB内存 
	 
public:	// 初始化及分配、释放部分、亮度、备份图像内存一些函数 
    BOOL   NewHSIImg(); 
    BOOL   NewBuffer(); 
	void   AllocateMemory(BOOL IsExistRGBMask=FALSE);     
	 
	void   ReleaseHueImg(); 
    void   ReleaseBuffer();	 
	void   ReleaseDibPalInfo(); 
	void   InitTrueColorInfo(); 
	void   InitGrayImageInfo(); 
    void   DeleteMe(); 
private:	 
    void   ConstructInit(); 
};     
HANDLE  CopyHandle (HANDLE h);  
#endif