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. 在已设置好并正常显示位图的基础上更换图片的方法: