基于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());//写图像
}
这样就可以把图像存储在选定的路径下。