今天用到了CBitMap ,突然前段时间使用的CImage这个类,所以就想看看之前怎么用的这个,顺便写写了!
1)CBitMap 的使用: 在窗口中贴图
过程:
1、创建位图
CBitmap bitmap;
bitmap.LoadBitmap(IDB_BITMAP1);
2、创建兼容DC
CDC dcCompatible;
dcCompatible.CreateCompatibleDC(pDC);
3、将位图选到兼容DC中
dcCompatible.SelectObject(&bitmap);
4、将兼容DC中的位图贴到当前DC中。
pDC->BitBlt(rect.left,rect.top,rect.Width(),rect.Height(),&dcCompatible,0,0,SRCCOPY); 直接显示rect大小的图片。
SRCCOPY:将源矩形区域直接拷贝到目标矩形区域。
lDC->StretchBlt(m_xStart,m_yStart,iWidth,iHeight,&dcMem,0,0,bmp.bmWidth,bmp.bmWidth,SRCCOPY); //显示缩放后的大小
bmp 的获得:
BITMAPbmp;
Bitmap.GetBitmap(&bmp);
2) CImage 的使用:
首先介绍下这个类 这一部分是在网上摘抄的
CImage类
我们知道,Visual C++的CBitmap类和静态图片控件的功能是比较弱的,它只能显示出在资源中的图标、位图、光标以及图元文件的内容,而不像VB中的Image控件可 以显示出绝大多数的外部图像文件(BMP、GIF、JPEG等)。因此,想要在对话框或其他窗口中显示外部图像文件则只能借助于第三方提供的控件或代码。 现在,MFC和ATL共享的新类CImage为图像处理提供了许多相应的方法,这使得Visual C++在图像方面的缺憾一去不复返了。
CImage类概述
CImage是MFC和ATL共享的新类,它能从外部磁盘中调入一个JPEG、GIF、BMP和PNG格式的图像文件加以显示,而且这些文件格式可以 相互转换。由于CImage在不同的Windows操作系统中其某些性能是不一样的,因此在使用时要特别注意。例如,CImage::PlgBlt和 CImage::MaskBlt只能在 Windows NT 4.0 或更高版本中使用,但不能运行在Windows 95/98 应用程序中。CImage::AlphaBlend和CImage::TransparentBlt也只能在 Windows 2000/98或其更高版本中使用。即使在Windows 2000运行程序还必须将stdafx.h文件中的WINVER和_WIN32_WINNT的预定义修改成0x0500才能正常使用。
CImage封装了DIB(设备无关位图)的功能,因而可以让我们能够处理每个位图像素。它具有下列最酷特性:
1、AlphaBlend支持像素级的颜色混合,从而实现透明和半透明的效果。
2、PlgBlt能使一个矩形区域的位图映射到一个平行四边形区域中,而且还可能使用位屏蔽操作。
3、TransparentBlt在目标区域中产生透明图像,SetTransparentColor用来设置某种颜色是透明色。
4、MaskBlt在目标区域中产生源位图与屏蔽位图合成的效果。
在这里至于其所说额特性,自己也没怎么接触到。
使用过程:
i) 当然第一步: #include <atlimage.h> ,此外如上文所说的,需要修改StdAfx.h 文件:
// Modify the following defines if you have to target a platform prior to the ones specified below.
// Refer to MSDN for the latest info on corresponding values for different platforms.
#ifndef WINVER // Allow use of features specific to Windows XP or later.
#define WINVER 0x0501 // Change this to the appropriate value to target other versions of Windows.
#endif
#ifndef _WIN32_WINNT // Allow use of features specific to Windows XP or later.
#define _WIN32_WINNT 0x0501 // Change this to the appropriate value to target other versions of Windows.
#endif
#ifndef _WIN32_WINDOWS // Allow use of features specific to Windows 98 or later.
#define _WIN32_WINDOWS 0x0410 // Change this to the appropriate value to target Windows Me or later.
#endif
#ifndef _WIN32_IE // Allow use of features specific to IE 6.0 or later.
#define _WIN32_IE 0x0600 // Change this to the appropriate value to target other versions of IE.
#endif
ii )刚刚看了看代码,发现当时写的时候确实遇到了个问题,这里也说说吧。
两种类型:一、直接将图片读入存在CImage对象中。
通过 CFileDlg 打开文件对话框,然后得到路径,并加载图片如下:
m_image.Draw(); 即可实现。
补充部分:今天在使用CImge时,遇到了点问题: 在Dlg中的OnPaint中调用Draw 后,运行总是无法显示图片。另:在调试时会看到图片在正确的位置显示!
解决办法:可能是自己傻了,自己不刷新重绘,就想让其显示,加入Invaliate();即可!
二、将存储图片的内存信息重新构造成CImage对象。
由于在程序中要使用多张图片,开始的时候,我就直接将加载的图片存入了CImage对象中,然后转存到响应的类对象中。但是当再次加载图片时,之后的图片会被删除
,也就是说,保存的一直是一个内存东西,因此后来就存储的图片的字节流。
这里将以下字节流转化为CImage的过程:
char *m_imageBuffer = new char[len];
if (m_imageBuffer != NULL)
{
HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE,m_ImageLen);
void * pData = GlobalLock(hGlobal);
memcpy(pData, m_imageBuffer, m_ImageLen);
GlobalUnlock(hGlobal);
IStream * pStream = NULL;
if (CreateStreamOnHGlobal(hGlobal, TRUE, & pStream) == S_OK)
{
CImage image;
if (SUCCEEDED(image.Load(pStream)))
{
image.Draw(lDC->m_hDC,m_xStart,m_yStart,imageWidth,imageHeight);
}
}
如上即可输出图片信息。而且对于无论是jig bmp都可的。