基于MFC对话框的图像处理之BMP图像的打开与保存。
在DIB模式下,将BMP图像的文件头、信息头等定义。
class ImageDib
{
//成员变量
public:
unsigned char * m_pImgData; //图像数据指针
LPRGBQUAD m_lpColorTable; //图像颜色表指针
int m_nBitCount; //每像素占的位数
private:
LPBYTE m_lpDib; //指向DIB的指针
HPALETTE m_hPalette; //逻辑调色板句柄
int m_nColorTableLength; //颜色表长度(多少个表项)
public:
int m_imgWidth; //图像的宽,像素为单位
int m_imgHeight; //图像的高,像素为单位
LPBITMAPINFOHEADER m_lpBmpInfoHead; //图像信息头指针
//成员函数
public:
ImageDib(); //构造函数
ImageDib(CSize size, int nBitCount, LPRGBQUAD lpColorTable,
unsigned char *pImgData); //带参数的构造函数
~ImageDib(); //析构函数
BOOL Read(LPCTSTR lpszPathName); //DIB读函数
BOOL Write(LPCTSTR lpszPathName); //DIB写函数
int ComputeColorTabalLength(int nBitCount); //计算颜色表的长度
BOOL Draw(CDC* pDC, CPoint origin, CSize size); //图像绘制
CSize GetDimensions(); //读取图像维数
void ReplaceDib(CSize size, int nBitCount, LPRGBQUAD lpColorTable,
unsigned char *pImgData); void Empty(); //用新的数据替换DIB
private:
void MakePalette(); //创建逻辑调色板
//清理空间
};
对话框下图像的打开:
CFileDialog file(TRUE,"打开位图",NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
"位图文件(*.BMP)|*.BMP||");
if(file.DoModal() == IDOK)
{
m_strFile = file.GetPathName();//获取路径名
m_dib.Read(m_strFile);//读取图像
show();//图像的打开
}
show()函数如下:
if(m_strFile != "")
{
CDC* picDC =GetDC();//设备句柄
CRect rect;
GetClientRect(&rect);
CSize size(rect.Width(),rect.Height());
//图像的显示大小
if(m_dib.GetDimensions().cx > rect.Width() || m_dib.GetDimensions().cy>rect.Height())
m_dib.Draw(picDC, CPoint(10,45), size);//以客户区大小显示图像
else
m_dib.Draw(picDC, CPoint(10,45), m_dib.GetDimensions()/*size*/);
ReleaseDC(picDC);
}
图像的保存:
CFileDialog file(false, "保存图像", NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, "位图文件(*.BMP)|*.BMP||");//弹出对话框,false很重要
file.m_ofn.lpstrTitle = "保存图像";//标题
if(file.DoModal() == IDOK)
{
m_dib.Write(file.GetPathName());//写图像
}
这样就可以把图像存储在选定的路径下。