GDI和GDI+对象的互相转换[r]

简介:
当然希望可以使用GDI+来完全代替GDI,再不济也只需要从GDI对象转到GDI+对象。但是就是有那么些半吊子的工程,又要新技术新特性、又希望快速开发、又不肯丢弃旧版本的已有的功能。没办法,只能打补丁。石头、剪子、不......

1.CDCGraphics只要这样:

Graphics g(pDC -> GetSafeHdc()); // 只要能构造CDC句柄的MFC对象都可以
// CClientDC、CPaintDC,也都可以 


2.CBitmap
Graphics需要创建一个内存位图设备:

CDC MemDC; 
CBitmap MemBitmap;
MemDC.CreateCompatibleDC(pDC);
MemBitmap.CreateCompatibleBitmap(pDC,size.cx, size.cy);
CBitmap 
* pOldBit = MemDC.SelectObject( & MemBitmap);
Graphics g(MemDC.GetSafeHdc());
///… you can work with GDI+ … ///

或者使用:

Bitmap::Bitmap(HBITMAP,HPALETTE)

以及

static  Bitmap  * FromHBITMAP(HBITMAP hbm,HPALETTE hpal)


3.
想要用Bitmap来打开图片,却又需要用GDI的绘图函数来操作(一般都为历史遗留问题),就需要将Bitmap对象转换到CBitmap,可以这样:

Bitmap *  pPicture  =   new  Bitmap(L " dotLive.jpg " );
HBITMAP hBitmap;
CBitmap
*  pbm;
pPicture
-> GetHBITMAP(Color( 0 , 0 , 0 ), & hBitmap);
pbm 
=  CBitmap::FromHandle(aaa1);
///… use pbm to do the GDI works ///
pbm -> DeleteObject(); // 要记得删除GDI对象,否则你会发现你的内存占用…

CView使用OnPaint打印图像就是一个例子,使用GDI+无法在打印纸上打印出图像,只有一片空白。在找到原因之前,只好从GDI+转换到GDI使用BitBlt和StretchBlt方式来打印。


4.
保存Bitmap,打开很方便,保存就不那么的方便了。Bitmap或者Image打开图像会自动锁定文件,保存时会产生文件被使用之类的错误。一种折衷的办法是,保存时全新创建一个BitmapImage)对象,将原来的对象画到新对象上,然后将原来的对象删除以释放文件。保存新对象。不能用clone,它会将锁定的文件资源一块复制过来,则解锁文件需要的释放对象就又多了一个。

Bitmap *  tPic =   new  Bitmap(L " dotLive.jpg " ); // 锁定文件
Bitmap *  pPicture  =   new  Bitmap(tPic -> GetWidth()
                                         ,tPic
-> GetHeight()
                                         ,tPic
-> GetPixelFormat());
Graphics g(pPicture);
g.DrawImage(tPic,
0 , 0 ,m_nWidth,m_nHeight); // 复制过来
delete tPic; // 解锁
/// … use the pPicture to access "dotLive.jpg" … ///
CLSID tiffClsid;
GetEncoderClsid(L
" image/jpeg " & tiffClsid); // 这个函数MSDN中有
pPicture -> Save(L " dotLive.jpg "  , & tiffClsid); // 保存

 

5.GraphicsHDC,想要用Bitmap方便打开图像,又要往图像里写文字作图等。糟糕的是由于历史遗留问题,这些操作都是使用GDI完成的。并且GDI+没有异或绘图模式(实现橡皮筋效果)、没有文字输出底色不透明、字符串需要转换到WChar。咋办呢,可以这样转:

Bitmap *  pPicture  =   new  Bitmap(L " dotLive.jpg " ); // 打开图片
Graphics tempG(pPicture );
HDC hdc 
=  tempG.GetHDC (); // 获得GDI句柄
CDC *  tempDC  =  CDC::FromHandle(hdc);
/// … hurry up, draw what you want … ///
tempG.ReleaseHDC(hdc);  // 要记得relese,GDI都需要释放,否则资源会被占用而不接受其他操作

路漫漫其修远兮 吾将上下而求索


本文转自 lu xu 博客园博客,原文链接: http://www.cnblogs.com/dotLive/archive/2006/08/25/486588.html  ,如需转载请自行联系原作者

相关文章
|
存储 Cloud Native Linux
openCV 图像对象的创建和赋值
openCV 图像对象的创建和赋值
关于 操作COM组件的RGB属性只能传递一个int表达COM三色属性rgb 的解决方法
关于 操作COM组件的RGB属性只能传递一个int表达COM三色属性rgb 的解决方法
关于 操作COM组件的RGB属性只能传递一个int表达COM三色属性rgb 的解决方法
【MATLAB】基本绘图 ( 句柄值 | 对象句柄值获取 | 创建对象时获取句柄值 | 函数获取句柄值 | 获取 / 设置 对象属性 | 获取对象属性 )(二)
【MATLAB】基本绘图 ( 句柄值 | 对象句柄值获取 | 创建对象时获取句柄值 | 函数获取句柄值 | 获取 / 设置 对象属性 | 获取对象属性 )(二)
294 0
【MATLAB】基本绘图 ( 句柄值 | 对象句柄值获取 | 创建对象时获取句柄值 | 函数获取句柄值 | 获取 / 设置 对象属性 | 获取对象属性 )(二)
|
容器
【MATLAB】基本绘图 ( 句柄值 | 对象句柄值获取 | 创建对象时获取句柄值 | 函数获取句柄值 | 获取 / 设置 对象属性 | 获取对象属性 )(一)
【MATLAB】基本绘图 ( 句柄值 | 对象句柄值获取 | 创建对象时获取句柄值 | 函数获取句柄值 | 获取 / 设置 对象属性 | 获取对象属性 )(一)
292 0
【MATLAB】基本绘图 ( 句柄值 | 对象句柄值获取 | 创建对象时获取句柄值 | 函数获取句柄值 | 获取 / 设置 对象属性 | 获取对象属性 )(一)
【OpenGL】八、初始化 OpenGL 渲染环境 ( 导入 OpenGL 头文件 | 链接 OpenGL 库 | 将窗口设置为 OpenGL 窗口 | 设置像素格式描述符 | 渲染绘制 ) ★(二)
【OpenGL】八、初始化 OpenGL 渲染环境 ( 导入 OpenGL 头文件 | 链接 OpenGL 库 | 将窗口设置为 OpenGL 窗口 | 设置像素格式描述符 | 渲染绘制 ) ★(二)
193 0
【OpenGL】八、初始化 OpenGL 渲染环境 ( 导入 OpenGL 头文件 | 链接 OpenGL 库 | 将窗口设置为 OpenGL 窗口 | 设置像素格式描述符 | 渲染绘制 ) ★(二)
|
存储 Windows
【OpenGL】八、初始化 OpenGL 渲染环境 ( 导入 OpenGL 头文件 | 链接 OpenGL 库 | 将窗口设置为 OpenGL 窗口 | 设置像素格式描述符 | 渲染绘制 ) ★(一)
【OpenGL】八、初始化 OpenGL 渲染环境 ( 导入 OpenGL 头文件 | 链接 OpenGL 库 | 将窗口设置为 OpenGL 窗口 | 设置像素格式描述符 | 渲染绘制 ) ★(一)
277 0
|
C#
“在引用COM组件时,出现了无法嵌入互操作类型。。。”的错误
  这两天在做一个需要将wps文档转换成word文档的程序,在调用wps的com组件时项目编译是没有问题的,但当运行的时候却弹出了下面的错误提示: 从网上百度一番后,找到了正确的解决方法。    先从Com组件中添加引用:   选中引入的Com组件库,右键-> 属性:   将“嵌入互操作类型”改为 False 选项:   重新编译,程序正常运行。
1143 0
|
C#
WPF中实现图片文件转换成Visual对象,Viewport3D对象转换成图片
原文:WPF中实现图片文件转换成Visual对象,Viewport3D对象转换成图片 1、图片文件转换成Visual对象         private Visual CreateVisual(string imageFileName)        {            BitmapImag...
1183 0
|
C#
Wpf ImageSource对象与Bitmap对象的互相转换
原文:Wpf ImageSource对象与Bitmap对象的互相转换 Bitmap to ImageSource 将得到的Bitmap对象转换为wpf常用的Imagesource对象 BitmapSource bs = Imaging.
2137 0