用CImage在picture控件上显示外部图片,并获取各像素颜色数据

1. 在stdafx.h文件中 #include <atlimage.h>

    注意,这句放在stdafx.h最后,并敲回车

2. 在要使用CImage的对话框类头文件中定义一个CImage对象 CImage m_Image; (也可以在要使用的函数内部定义)

3. 打开外部图像,并将外部图像文件装载到CImage对象中去:

    本例是在load按键的消息函数中:

   

void CGraphic::OnBnClickedBtnLoadbmp()
{
 // TODO: Add your control notification handler code here

 m_Image.Destroy();  // 清除之前的显示位图内存

 CString strFilter;
 CSimpleArray<GUID> aguidFileTypes;
 HRESULT hResult;

 // 获取CImage支持的图像文件的过滤字符串
 hResult = m_Image.GetExporterFilterString(strFilter,aguidFileTypes,
  _T( "All Image Files") );
 if (FAILED(hResult)) {
  MessageBox(_T("GetExporterFilter调用失败!"));
  return;
 }
 CFileDialog dlg(TRUE, NULL, NULL, OFN_FILEMUSTEXIST, strFilter);
 if(IDOK != dlg.DoModal())
  return;

 m_Image.Destroy();
 // 将外部图像文件装载到CImage对象中
 hResult = m_Image.Load(dlg.GetPathName());//许多教程上都写错了 都写的是GetFileName()
 if (FAILED(hResult)) {
  MessageBox(_T("调用图像文件失败!"));
  return;
 }

 bmpCol = m_Image.GetWidth();  // 位图宽度
 bmpRow = m_Image.GetHeight();  // 位图高度

 // 获取位图各子像素颜色数据
 subPixelData_image = GetImageSubPixelData(subPixelData_image);

 // 显示位图信息
 m_graDlg_staBMPInfm.Format("bmWidth=%d, bmHeight=%d",bmpCol,bmpRow);
 SetDlgItemText(IDC_STA_BMPINF,m_graDlg_staBMPInfm);

 patternType = BMP;
 Invalidate();

}

CImage 对象 load 外部 bmp 图片除了上面用打开图片路径选择图片的方法,还可以用下面直接选择图片的方法

先将 BMP 图片 copy 到工程的 res 文件夹下

然后将 BMP 图片导入到资源文件中:

 

用下面两种方法都可以直接 load BMP 图片:

用路径的方式 load BMP 图片:

/* 用路径的方式 load BMP 图片 */
m_image.Load(_T("./res/pi02_kit.bmp"));

 用资源 ID 的方式 load BMP 图片:

/* 用资源 ID 的方式 load BMP 图片 */
HINSTANCE hInstance =  AfxGetInstanceHandle();
m_image.LoadFromResource(hInstance, IDB_BITMAP_KIT);

4. 将装载的外部图像显示在picture控件上:

这里要注意两点:

a. picture 控件要设置成 BMP type

b. 显示图片的代码必须放在 OnPaint() 消息函数中

在OnPaint()消息函数中显示:

   CDC * pDC;
   pDC = GetDlgItem(IDC_BMP_DISPLAY)->GetDC();  // 获取picture控件DC

   HDC hDC;
   hDC = pDC->GetSafeHdc();  // 将CDC转成HDC

   ::SetStretchBltMode(hDC,HALFTONE);  // 防止颜色失真
   ::SetBrushOrgEx(hDC,0,0,NULL); 

   CRect rect_des(0,0,BMP_STRETCH_WIDTH,BMP_STRETCH_HEIGHT);  // 显示区域大小设置(240x240)
   CRect rect_src(0,0,bmpCol,bmpRow);  // 源图像要显示区域设置
   m_Image.StretchBlt(hDC,rect_des,rect_src,SRCCOPY);  // 按要求缩放比例显示

最后三行可以下面一行替代

//   m_Image.StretchBlt(hDC,CRect(0,0,240,240),CRect(0,0,bmpCol,bmpRow),SRCCOPY);

 5. 获取外部图像各子像素颜色数据

 int bmp_width = 0;
 int bmp_height = 0;
 bmp_width = m_Image.GetWidth();  // 图片宽度
 bmp_height = m_Image.GetHeight(); // 图片高度

 // 创建动态二维数组存储各行字符
 BYTE ** sub_col = new BYTE *[bmp_height];
 sub_col = new BYTE *[bmp_height];
 for (int i =0; i<bmp_height; i++)
 {
  sub_col[i] = new BYTE[(bmp_width)*3];
 }

 COLORREF col;
 for(int i=0; i<bmp_height;i++)
 {
  for(int j=0; j<bmp_width;j++)
  {
   // 获取各pixel颜色
   col = m_Image.GetPixel(j,i);   //GetPixel函数中,第一个参数表示列,第二个参数表示行!!!
   // 获取各subpixel颜色数据
   sub_col[i][(j*3)] = GetRValue(col);
   sub_col[i][(j*3)+1] = GetGValue(col);
   sub_col[i][(j*3)+2] = GetBValue(col);
  }
 }

6. 在已设置好并正常显示位图的基础上更换图片的方法:

 

 

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值