GDI对象与设备描述表(DC)息息相关,设备描述表是Windows使用的一个数据结构,用于存储具体设备能力和与如何在设备上重绘一些项目的有关属性信息。而且视频设备的设备描述表还与特定的窗口有关。首先你必须获得一个设备描述表句柄,然后在图形绘制时,你把这个句柄作为一个参数传递给GDI图形绘制函数。当然你也可以把它传递给获得或设置设备描述表有关属性的函数。
而GDI+对象,你不必使用句柄或者设备描述表。相反,只是简单地创建一个图形对(Graphics),然后以你熟悉的面向对象的编程方式调用它的方法即可,譬如myGraphicsObject.DrawLine(parameters), Graphics对象是GDI+的核心,正如设备描述表是GDI的核心一样,设备描述表(DC)和图形对象(Graphics)在不同的环境下扮演着同样的角色,发挥着类似的作用,但是两者也存在着这质的不同.前者使用基于句柄的编程方法而后者使用面向对象的编程方法。
GDI与GDI+作为微软对图像处理先后产生的两种解决方法,其之间的兼容问题经常会出现,并且在不同的情况有各自的好处。因此GDI与GDI+之间的转化尤为让人头疼,下面提供常见对象的转化。
- GDI+的Bitmap转换为GDI的CBitmap:(核心部分是利用Bitmap类的成员函数GetHBITMAP获得图像的基本信息)
//已有的Bitmap对象pBitmap,以及CDC对象pDC
CBitmap* bmp;
CDC m_dcBmp;
m_dcBmp.CreateCompatibleDC(&pDC);
HBITMAP hBitmap;
pBitmap->GetHBITMAP(Color(0,0,0),&hBitmap);//占用内存较多,
bmp= CBitmap::FromHandle(hBitmap);
m_dcBmp.SelectObject(bmp);//bmp对象获得了pBitmap的所有信息,CBitmap对象对应的设备为m_dcBmp
2. GDI的CBitmap转换为GDI+的Bitmap:(核心部分是利用Bitmap类的构造函数Bitmap::Bitmap(HBITMAP,HPALETTE)获得CBitmap对象图像的基本信息)
CBitmap* bmp=m_dcbmp.GetCurrentBitmap();
HBITMAP bmp_hbitmap=(HBITMAP)(*bmp);
Bitmap m_pBmp(bmp_hbitmap,NULL);
首先通过MSDN文档查得Bitmap是Image的子类,所以我们用Bitmap来实现,最后强制把Bitmap转成Image。看到网上有不少的人在问,好像答案挺少的。在这里贴出来,仅两行代码就可以实现喽。
- void BitmapToImage(CBitmap *pBitmap,Image* &img)
- {
-
- HBITMAP hBmp = (HBITMAP)pBitmap->GetSafeHandle();
-
- img = new Bitmap(hBmp,NULL);
- }
- 下午在网上找了很久关于把资源文件中的位图导入到gdi+的Bitmap对象中的方法,但是网上的方法不是要写大段的代码,就是根本无法实现预期目标。最后通过我自己的尝试发现了一个简单易用的方法。就是先把位图导入到一个gdi对象CBitmap中然后通过其句柄加载到gdi+的Bitmap对象中。代码如下:
-
- CBitmap bmp;
-
- bmp.LoadBitmap(IDB_BITMAP1);
-
- Bitmap bitmap((HBITMAP)bmp);
-
- 仅三行代码就够了!
有了HBITMAP句柄和BITMAP,怎样操作位图数据?
软件
编程语言
HBITMAP hBitmap;
BITMAP m_bmp;
GetObject(hBitmap,sizeof(m_bmp),&m_bmp);
现在怎样修改位图数据?
哦你拿到HBITMAP了啊。
下一步你该看GetDIBits函数了
p.s. 我自己的话用的是gdi+不是gdi,所以GetDIBits其实我不熟
gdi+里面拿到Bitmap对象以后是调用LockBits的