⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 image.h

📁 医学图象处理系统
💻 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 &LTp, CPoint &RBp);  
	
	// 对产生的部分图像处理的函数
	BOOL CreateEmpty(P_LONG width, P_LONG height,int PixelDepth,DWORD colornum);
    BOOL CreatePartImg(CImage &source, CPoint &LTp, 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

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -