MFC显示位图(2-1)

MFC中可以通过Picture Control控件显示位图,也可以通过CBitmap类显示位图。

1 通过Picture Control控件显示位图

Picture Control控件实际上就是静态控件,即CStatic类。可以通过该控件的属性或者对该控件的成员变量,实现位图的显示。

1.1 通过设置控件属性显示位图

VS2008中创建一个基于对话框的MFC程序。

1.1.1 创建控件

“工具箱”中将Picture Control控件拖入到对话框中,如图1所示。

 

1 Picture Control控件拖入到对话框中

1.1.2 导入位图

将要显示的位图导入到项目中,导入的方法见《MFC导入图标文件的方法》。

1.1.3 设置控件属性

选中创建的Picture Control控件,之后在右键菜单中选择“属性”,在控件属性栏中,将“Type”的值选择为“Bitmap”,并且将“Image”的值选择为在“1.1.2 导入位图”中导入的位图ID。此时,在资源编辑窗口中就已经显示了该位图,如图2所示。

 

2 设置属性后的Picture Control控件

1.2 通过控件成员变量实现位图的显示

首先将1.1.3 设置控件属性”中提到的Picture Control控件的属性修改为默认值“Frame”。

1.2.1 为控件添加成员变量

选择该控件,在右键菜单中选择“添加变量”。之后,在“添加成员变量向导”对话框中将“类别”设置为“Control”,变量名设置为“m_image”,如图3所示。

 

3 为控件添加变量

1.2.2 通过成员变量设置控件

“1.1 通过设置控件属性显示位图”中可以看出,在控件中显示位图,首先要将控件的“类型”属性设置为“Bitmap”,之后指定要显示的位图。通过成员变量设置控件属性时,也是按照这个顺序。

1)设置控件类型属性

通过为控件添加的成员变量m_image,调用其成员函数ModifyStyle()来设置控件的类型属性。在基于对话框程序的OnInitDialog()函数中添加如下代码

m_image.ModifyStyle(SS_CENTER, SS_BITMAP, 0);
其中,ModifyStyle() 的第一个参数表示删除控件的 SS_CENTER 属性;第二个参数表示为控件添加SS_BITMAP 属性;第三个参数0 表示不移动控件的位置。

2)设置控件要显示的位图

通过成员变量m_image设置要显示的位图,首先要获得该位图的句柄。在OnInitDialog()函数中通过Windows API函数LoadBitmap()获取指定位图的句柄。

HBITMAP hBitmap = ::LoadBitmap(
AfxGetInstanceHandle()
, MAKEINTRESOURCE(IDB_BITMAP1)
);
其中,AfxGetInstanceHandle() 函数的作用是获取包含位图的程序的实例句柄; IDB_BITMAP1 是在“ 1.1.2 导入位图”中导入的位图 ID 。位图的句柄保存在 hBitmap 中。

接下来通过控件的成员变量m_image调用其成员函数SetBitmap()来设置要显示的位图。

m_image.SetBitmap(hBitmap);
其中,hBitmap 是要显示位图的句柄。

通过以上代码,也可以实现在Picture Control控件中显示指定的位图。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 以下是MFC中将24位转换成1位位的代码实现: 1. 首先,需要打开24位像文件,并将其加载到内存中。可以使用CImage类来实现这个过程: CImage img; img.Load(_T("24bit.bmp")); 2. 然后,需要创建一个新的1位位,并将其大小设置为与原始像相同。可以使用CBitmap和CDC类来实现这个过程: CBitmap bmp; bmp.CreateBitmap(img.GetWidth(), img.GetHeight(), 1, 1, NULL); CDC memDC; memDC.CreateCompatibleDC(NULL); memDC.SelectObject(&bmp); 3. 接下来,需要将原始像的每个像素转换为黑白像素,并将其写入新的1位位中: for (int y = 0; y < img.GetHeight(); y++) { for (int x = 0; x < img.GetWidth(); x++) { COLORREF pixel = img.GetPixel(x, y); int r = GetRValue(pixel); int g = GetGValue(pixel); int b = GetBValue(pixel); int gray = (r + g + b) / 3; if (gray < 128) { memDC.SetPixel(x, y, RGB(0, 0, 0)); } else { memDC.SetPixel(x, y, RGB(255, 255, 255)); } } } 4. 最后,需要将转换后的1位位保存到文件中: CImageConverter converter; converter.SaveBitmapToFile(bmp, _T("1bit.bmp"), _T("BMP")); 完整的代码如下: CImage img; img.Load(_T("24bit.bmp")); CBitmap bmp; bmp.CreateBitmap(img.GetWidth(), img.GetHeight(), 1, 1, NULL); CDC memDC; memDC.CreateCompatibleDC(NULL); memDC.SelectObject(&bmp); for (int y = 0; y < img.GetHeight(); y++) { for (int x = 0; x < img.GetWidth(); x++) { COLORREF pixel = img.GetPixel(x, y); int r = GetRValue(pixel); int g = GetGValue(pixel); int b = GetBValue(pixel); int gray = (r + g + b) / 3; if (gray < 128) { memDC.SetPixel(x, y, RGB(0, 0, 0)); } else { memDC.SetPixel(x, y, RGB(255, 255, 255)); } } } CImageConverter converter; converter.SaveBitmapToFile(bmp, _T("1bit.bmp"), _T("BMP")); ### 回答2: MFC提供了一种简单的方法将24位像转换为1位位,可以通过使用CImage类和相关函数来实现。下面是一个示例代码: ```cpp // 加载24位像 CImage img; img.Load(_T("24bit_image.bmp")); // 获取像宽度和高度 int width = img.GetWidth(); int height = img.GetHeight(); // 创建1位位 CImage img1bit; img1bit.Create(width, height, 1); HBITMAP hBitmap1bit = img1bit; CDC* pDC = CDC::FromHandle(img1bit.GetDC()); // 对每个像素进行转换 for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { // 获取像素的RGB值 RGBQUAD color; img.GetPixel(x, y, &color); // 将RGB值转换为灰度值 int gray = (color.rgbRed + color.rgbGreen + color.rgbBlue) / 3; // 如果灰度值大于128,则设置像素为白色;否则设置为黑色 if (gray > 128) { pDC->SetPixel(x, y, RGB(255, 255, 255)); // 白色 } else { pDC->SetPixel(x, y, RGB(0, 0, 0)); // 黑色 } } } // 保存1位位到文件 img1bit.Save(_T("1bit_image.bmp")); img1bit.ReleaseDC(); ``` 以上代码首先使用CImage类加载24位像。然后创建一个与原像具有相同宽度和高度的1位位。接下来对每个像素进行遍历,将其RGB值转换为灰度值,然后根据灰度值设置对应像素为黑色或白色。最后,保存1位位到文件。 ### 回答3: MFC是一个用于开发Windows形用户界面应用程序的框架。要将24位转换为1位位,可以使用MFC中的GDI+形库来实现。以下是实现该功能的代码示例: 1. 首先,需要包含必要的MFC头文件和命名空间: ``` #include <afxwin.h> using namespace Gdiplus; ``` 2. 创建一个MFC对话框应用程序,并在对话框类的头文件中添加下面的声明: ``` class CMyDialog : public CDialog { protected: virtual void DoDataExchange(CDataExchange* pDX); DECLARE_MESSAGE_MAP() // 存储24位和1位位的变量 CImage m_img24bit; CImage m_img1bit; }; ``` 3. 在对话框类的实现文件中,添加下面的代码来实现像转换: ``` void CMyDialog::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); DDX_Control(pDX, IDC_PICTURE, m_picture); // IDC_PICTURE是对话框上的片框控件的ID } void CMyDialog::OnButtonConvert() { // 加载24位 m_img24bit.Load(_T("24bit.bmp")); // 24bit.bmp是要转换的24位文件路径 // 创建1位位 m_img1bit.Create(24, 24, 1); // 创建一个24x24像素的1位位 // 获取24位的位数据 BYTE* pBits24bit = (BYTE*)m_img24bit.GetBits(); // 获取1位位的位数据 BYTE* pBits1bit = (BYTE*)m_img1bit.GetBits(); // 将24位转换为1位位 for(int i = 0; i < 24 * 24; i++) { // 分别获取24位中每个像素点的RGB值 BYTE r = pBits24bit[3 * i + 2]; BYTE g = pBits24bit[3 * i + 1]; BYTE b = pBits24bit[3 * i]; // 计算1位位中每个像素点的索引 int index = (r + g + b) > 383 ? 1 : 0; // 设置1位位中每个像素点的值 pBits1bit[i] = index; } // 显示1位位 m_picture.SetBitmap((HBITMAP)m_img1bit.GetSafeHandle(), CxImage::CBORROW); // 保存1位位到文件 m_img1bit.Save(_T("1bit.bmp")); // 1bit.bmp是转换后的1位位文件路径 } ``` 以上代码示例假设24位和1位位的尺寸都是24x24像素。在实际使用时,请根据具体需求进行调整。同时,请注意替换代码中的文件路径和控件ID,以适应实际情况。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值