GDI和GDI+对象的相互转换

GDI+对象转换为内存对象 前提图像格式转换我们有如下思路 1、使用开源库CXimage等 2、解析图像格式,自己开发图像库 3、使用GDI+ 4、其他 今天我们使用GDI+作为图像处理的方法。GDI+可以做图层、图像的处理,但是他也有自身的不足,比如说效率、不能保持为内存对象。今天我们就解析如何将GDI+转换为内存对象以及如何将内存对象转化为GDI+对象,具体的看代码 static int GetEncoder 阅读详情
GDI和GDI+对象的相互转换
作者:dotLive


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

1.CDC到Graphics只要这样:

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打开图像会自动锁定文件,保存时会产生文件被使用之类的错误。一种折衷的办法是,保存时全新创建一个Bitmap(Image)对象,将原来的对象画到新对象上,然后将原来的对象删除以释放文件。保存新对象。不能用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.Graphics到HDC,想要用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都需要释放,否则资源会被占用而不接受其他操作

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





转贴来源: http://www.cnblogs.com/dotLive/archive/2006/08/25/486588.html
C#的GDI+绘图详解 /消除锯齿 或 AntiAlias。// 1.在窗体或控件的Paint事件中,用PaintEventArgs e 创建绘图对象 ---- 控件或窗体重绘时。//为控件创建绘图对象。//--------------------以上方法三选一。//2.创建绘图对象 panel1中绘图。 阅读详情

相关推荐

GDI 总结三: CImage类使用

若对您有所启发 欢迎打赏 古典小说网 致力于打造极致阅读体验 首创卡拉OK读书方式 首创,桌面大屏幕TXT阅读方式 前言 CImage类是基于GDI+的,但是这里为什么要讲归于GDI? 主要是基于这样的考虑: 在GDI+环境中,我们可以直接使用GDI+ ,没多少必要再使用CImage类 ...

目前打算换一个工作,有招聘windows c++方向的也欢迎联系,北京、济南 最好 5万+

GDI+开发教程 学习记录二 GDI 与GDI+ 区别

Graphics 对象是将屏幕的某一个窗口与之相关联,并包含绘图操作所需要的相关属性。Graphics 对象与设备环境句柄还存在着联系,其余的如 Pen、Brush、Image 和 Font 等对象均不再使用设备环境。

u010001070的博客 339

GDI+图像格式转换

能在GDI+中进行图像格式转换,能保存程序能编码的格式图像,例如BMP,JPG,TIFF PNG EMF 等,另存为任意目录,任意名字!

C#GDI和GDI+,GDI和GUI区别?

是图形用户接口,英文全称:Graphics User Interface。指用户界面,如窗体,控件。是用户和计算机有一个操作界面,用户在这个界面上的操作都是可见的;是图形设备接口,包含图形编程相关的对象和方法。是有图形编程有关的一系列接口,包括了绘图的所有元素,例如画笔,画刷,调色盘,矩形等所有和绘图有关的东西。

2301_79849777的博客 1562

RAGFlow核心引擎DeepDoc之PDF解析大起底

本文深入解析RAGFlow中的deepdoc模块,重点介绍了pdf文档解析器的实现细节。deepdoc包含parser(文档解析器)和vision(视觉处理)两大核心功能,其中pdf解析是最复杂的部分。文章详细剖析了PdfParser类的设计架构,包含PlainParser(基础文本提取)、RAGFlowPdfParser(核心处理流水线)和VisionParser(视觉扩展)三个类,它们通过统一的__call__方法返回标准化结果。还具体讲解了初始化过程如何加载OCR引擎、布局识别模型、表格结构识别器等关

yxkong的专栏 2026

探索niri:让你的Linux桌面布局无拘无束

niri是一款基于Wayland的滚动平铺合成器,采用创新的窗口管理方式。它将窗口排列为向右无限延伸的条目,支持独立显示器布局和动态垂直工作区,确保多任务操作流畅性。核心功能包括概要视图、截图界面、屏幕投射、手势操作、窗口分组等,并支持自定义布局和动画效果。niri具备良好的稳定性,兼容xwayland-satellite工具,灵感来自PaperWM但突破了GNOME限制。该项目为追求高效桌面管理的用户提供了全新解决方案,欢迎加入社区交流体验。

weixin_44626085的博客 1817

GDI+学习

最近练习写ActiveX图形控件,所以了解了一些GDI和GDI+的知识。GDI全称Graphics Device Interface,它是Windows图形程序设计不可或缺的一部分,在微软推出Windows2000,WindowsXP,Windows 2003等操作系统之后,GDI也得到了升级和增强,被称之为GDI+。一般情况下,vs 7.0以前版本的开发工具都使用GDI SDK,...

weixin_30599769的博客 347

Claude Code教程(二) | Claude Code 核心信息与使用指南

Claude Code 核心信息与使用指南

qq_20236937的博客 2186

c语言 gdi,GDI和GDI+对象的相互转换

当然希望可以使用GDI+来完全代替GDI,再不济也只需要从GDI对象转到GDI+对象。但是就是有那么些工程,又要新技术新特性、又希望快速开发、又不肯丢弃旧版本的已有的功能。没办法,只能缝缝补补,咔哐碙啌…一、CDC到Graphics只要这样:Graphics g(pDC->GetSafeHdc());//只要能构造CDC句柄的MFC对象都可以//CClientDC、CPaintDC,也都可以...

weixin_29267307的博客 374

ABB机器人发送实时位置给PLC

本文使用中断方式实现,多任务要订购ABB功能包 Profinet总线组变量配置 注:映射为16位和32位均可用 声明数据 VAR num CurrentExAxisPos;!外轴位置 VAR robtarget pCurrentPos;!实时位置 var intnum TrapNum;!中断号 初始化开中断 IDelete TrapNum;!中断号 CONNECT TrapNum WITH iTrapCurPos;!连接中...

澍澍爸的blog 6778

Open3D 教程学习指南 (持续整理)

Open3D 是一个开源库,旨在为 3D 数据处理提供高效且易用的工具。它由 Intel 开发和维护,支持多种 3D 数据处理任务,如点云处理、3D 重建、几何处理和可视化等。

Chase Blog 5932

GDI和GDI+对象的相互转换(转)

一、CDC到Graphics只要这样: Graphics g(pDC->GetSafeHdc());//只要能构造CDC句柄的MFC对象都可以  //CClientDC、CPaintDC,也都可以   二、CBitmap到Graphics需要创建一个内存位图设备:  CDC MemDC;CBitmap MemBitmap;MemDC.CreateCompatibleDC(pDC);M...

weixin_34126557的博客 111

立创EDA手动拼板实战:当自带功能不够用,如何用‘复制粘贴’搞定异形拼版与特殊布局

本文详细介绍了立创EDA手动拼板技术在异形拼版与特殊布局中的应用实战。通过CTRL+SHIFT+V等核心操作技巧,解决混合尺寸拼板、特殊间距需求等复杂场景,提升PCB设计效率与灵活性,特别适合需要高精度控制的射频电路和医疗设备项目。

weixin_31967485的博客 387

VC中句柄、指针、ID之间的转换

 win32直接操作的是句柄HANDLE,每个句柄就对应windows窗口,而vc对HANDLE进行类封装,间接操作的都是HANDLE,现在句柄只是类的一个成员变量。从句柄到指针 CWnd* pWnd=CWnd::FromHandle(hWnd); //a temporary CWnd object is created //and attached. pWnd->Attach(hWnd)

2173

cuRobo 入门教程(一)基于CUDA的机器人运动规划加速库

cuRobo是一款基于CUDA加速的机器人算法库,提供运动学计算、碰撞检测、轨迹优化等功能。该库采用并行优化技术,在GPU上实现高效运算,比现有方案快60倍。cuRobo支持多种机器人模型和环境表示,包含正向/逆向运动学、无碰撞轨迹生成、模型预测控制等核心算法,并可与IsaacSim等仿真平台集成。其特点包括:1) 支持多种碰撞检测方式(长方体/网格/深度图像);2) 提供批量环境处理和实时世界更新;3) 通过CUDA Graphs加速优化迭代;4) 在Jetson Orin等平台实现毫秒级运动规划。安装支

2506_90492529的博客 1931

一文整理深度学习【深度学习linux的docker+pytorch+cuda+nvidia-docker+vscode配置】

docker+pytorch+cuda+nvidia-docker+vscode

Edward的博客 1335

MFC获得主窗口和父窗口指针

VC++中有关句柄和指针及其转换 1.MFC窗口的句柄和指针的转换 (1) 一般窗口对象都会有一个其对应的句柄变量,所以我们可以取此对象的m_hWnd属性来得到句柄。 (2)使用GetSafeHwnd函数取得程序所在窗口类的句柄 (3)使用FromHandle函数来通过句柄得到其想要的指针 其他的一些方法: GetActiveWindo...

u011555996的博客 6004

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

mfc中id,句柄,指针

win32直接操作的是句柄HANDLE,每个句柄就对应windows窗口,而vc对HANDLE进行类封装,间接操作的都是HANDLE,现在句柄只是类的一个成员变量。 从句柄到指针  CWnd* pWnd=CWnd::FromHandle(hWnd); //a temporary CWnd object is created //and attached.  pWnd->Attach(hW

u012592081的专栏 813

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Windows GDI和GDI+编程实例剖析

<br />1.基本概念<br /><br />  GDI在Windows中定义为Graphics Device Interface,即图形设备接口,是Windows API(Application Programming Interface)的一个重要组成部分。它是Windows图形显示程序与实际物理设备之间的桥梁,GDI使得用户无需关心具体设备的细节,而只需在一个虚拟的环境(即逻辑设备)中进行操作。它的桥梁作用体现在:<br /><br />  (1)用户通过调用GDI函数将逻辑空间的操作转化为具体针对

Augusdi的专栏 1686

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

上一篇: VC中预处理指令与宏定义的妙用之二
下一篇: stl regex 行匹配记录
XNightSky
博客等级 码龄17年 15粉丝 4原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值