MFC Dialog BMP 图像的打开与保存

本文介绍了如何在MFC Dialog应用程序中处理BMP图像,包括使用类`ImageDib`进行DIB读写,创建逻辑调色板,以及在对话框上显示和保存图像的操作步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

     基于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());//写图像
}

这样就可以把图像存储在选定的路径下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值