GDI+效率问题与优化

使用GDI+进行图片处理时要注意的问题 阅读详情

这周在用GDI+实现图片的动画效果,起初每画一帧都在30-40ms左右,动画效果自然不能令人满意。

困惑了良久,后面在高人的指点下,效率有了显著地提高,最主要是清楚了时间都花在了那里,优化起来也就方便很多。

 

我现在知道的影响GDI+效率的主要有:
1、DrawImage,比起BitBlt实在差的不是一点点,解决的方法就是用BitBlt替换DrawImage。
2、PixelFormat ,原来没想到这个也会影响效率,但事实证明确实是这样。

Bitmap在new出来的时候是和图片本身的格式有关的,但在最终画到DC上的可不一定是这个格式,具体的格式请查阅MSDN:Image Pixel Format Constants

如果格式不对,DrawImage时会自己做一次图片格式转换,这个也会浪费一定的时间。

一个做法就是Bitmap在new出来后用clone到一个新的 Bitmap,这时是可以转换成指定的PixelFormat的:)
统一成一种格式,特别是大图的时候,效果比较明显。
3、尽量用CachedBitmap替代直接的Bitmap使用也能优化一些效率。

4、每次都全部重画是一种浪费,能不重画的就不重画,刷新的区域也是优化的一个有效方式。

5、对象的构造比较费时,比如用于双缓冲的内存Bitmap和Graphics最好设成成员变量,而不是在OnPaint中每次新建

6、减小图片大小 :)

……

 

关于GDI和GDI+

GDI的效率更高,而GDI+无疑更加易用,鱼与熊掌不可兼得。

我现在的做法是用GDI+画到内存Bitmap上,最后用GDI BitBlt画到DC上。

 

小结:

最开始很郁闷,怎么优化都不见效果,感觉乱成一团,于是不断地msdn,google,找人……

终于,在理清大部分的细节后发现:答案其实也很简单。

 

事情还没结束,今天也太晚了,就先写个大概,备忘下,下次有空时再整理个例子出来。希望大家批评指正。

 

感谢老师给我的帮助:)

 

2009-07-05 0:31 --THE END--

 

// 添加于2009/7/31

把gdi+转成gdi来画到dc上的代码片段,希望对大家有所帮助。

 

 

以上代码是从我自己的工程中抽取出来的,没有定义的变量请自行处理。

最近太忙没空也懒得去抽成一个简单的例子。但最重要的部分已经都在上面的代码中呈现。

 

再啰嗦下我的的使用流程:

1、InitDialog中用CreateDib创建出hBmpSection,并得到他的bmpData

2、程序的否个地方把你的东西画到gdi+的Bitmap上

3、调用FlushToDib,把你的Bitmap写到第一步的bmpData中

4、OnPaint中间hBmpSection用BitBlt到dc上

 

--- the end 2---

GDI绘图性能与效率的提高及改善 详细分析了对GDI绘图效率必善的方法,并涉及了一些DirectDraw的技术,收录了多篇业内高手的技术论文 立即下载

相关推荐

【GAN】pytorch-CycleGAN-and-pix2pix开源项目训练自定义数据集

Github:https://github.com/junyanz/pytorch-CycleGAN-and-pix2pix 一、概念简介 图像转换:将一张图片转换为不同风格的图片,如将一张灰度图变成彩色图,素描图换成实物图。 pix2pix:需要成对的数据集,两个不同域的图像一一对应。 CycleGAN:不需要成对的数据集,只用两个不同域(domain)的图像集合X和Y,两个集合中的图像不是一一对应的。 二、训练pix2pix模型 2.1 combine_A_and_B datasets/combin

See_Star的博客 4756

GDI+ GDI提高效率

1、DrawImage,比起BitBlt实在差的不是一点点,解决的方法就是用BitBlt替换DrawImage。 2、PixelFormat,原来没想到这个也会影响效率,但事实证明确实是这样。 Bitmap在new出来的时候是和图片本身的格式有关的,但在最终画到DC上的可不一定是这个格式,具体的格式请查阅MSDN:Image Pixel Format Constants 如果格式不对,D

曾伟的专栏 1226

BU61580芯片实战:手把手教你配置1553B通信的BC端寄存器(含代码解析)

本文详细解析了BU61580芯片在1553B通信中的BC端寄存器配置方法,包括关键寄存器功能映射、初始化代码解析及回环测试实现。通过实战案例和代码示例,帮助开发者快速掌握1553B通信的核心技术,提升系统稳定性和通信质量。

a1b2c的博客 224

GDI+最佳实践及改善性能说明(来自Graphics Programming with GDI+)

1. 使用“CreateGraphics”或“CreateFrom”等方法创建的Graphics对象用完之后必须Dispose掉 2. 从“Onpaint”或“PaintEventArgs.Graphics”获取的Graphics对象,一般不需要Dispose掉 3. 不要Dispose掉与Button、ListBox、DataGrid等控件关联的Graphics对象 4. 在“OnPain...

weixin_30886233的博客 357

《UDS/OBD诊断需求编辑工具》总目录

目录 1 基于CANdela Studio编辑CDD诊断描述文件 2 基于ODX Studio编辑ODX/PDX文件 2.1 编辑ODX-D诊断描述文件 2.2 编辑ODX-F刷写软件 该专栏主要负责介绍CANdela Studio和ODX Studio编辑CDD/ODX/PDX诊断描述文件。 1 基于CANdela Studio编辑CDD诊断描述文件 2 基于ODX Studio编辑ODX/PDX文件 【ODX介绍 】-1- 标准梳理 【ODX介绍】 -2-如何手..

「汽车电子助手」的博客 1万+

刚体转动欧拉方程:从理论到卫星姿态控制的实践

刚体转动欧拉方程是描述刚体旋转运动的基本动力学方程,在卫星姿态控制、机器人学、航空航天等领域有着广泛应用。本文将详细讲解欧拉方程的物理概念、数学推导、数值计算方法,并重点分析其在卫星姿态控制系统中的具体应用。

ScilogyHunter的博客 644

[转]GDI+效率问题与优化

这周在用GDI+实现图片的动画效果,起初每画一帧都在30-40ms左右,动画效果自然不能令人满意。 困惑了良久,后面在高人的指点下,效率有了显著地提高,最主要是清楚了时间都花在了那里,优化起来也就方便很多。 我现在知道的影响GDI+效率的主要有: 1、DrawImage,比起BitBlt实在差的不是一点点,解决的方法就是用BitBlt替换DrawImage。2、PixelFormat ,原来没...

weixin_30576827的博客 218

一文吃透!C#上位机CAN总线通信开发:从协议解析到数据可视化

CAN底层协议仅定义了8字节数据的传输规则,实际业务需自定义应用层协议,实现多类型数据的有序传输,这是数据解析的核心。仲裁ID(16进制)数据长度(DLC)数据场格式业务含义解析规则0x0014字节0~3:温度数据温度采集(单位:℃)4字节→float类型(大端/小端需统一,如西门子PLC格式)0x0022字节0~1:转速数据电机转速(单位:r/min)2字节→short类型(Int16)0x0031字节0:bit0~bit7设备状态(8路开关量)

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 847

感叹GDI+绘图的效率问题

初来公司,给的第一本书就是关于GDI+的。从教程到现在使用情况来看,确实比GDI方便许多。但最近却因为重绘时间的问题,一直苦恼万分。于是开始翻查各类资料,发现原来GDI+绘图效率比GDI差很多。下面是其它研究人员的测试结果和讨论: http://blog.youkuaiyun.com/debehe/article/details/4322356 http://topic.youkuaiyun.com/u/2007...

weixin_30692143的博客 200

【RT-DETR多模态融合改进】| 自研 多模态大核选择模块:MM_LSK,适配多模态图像信息融合

本文记录的利用改进的多模态大核选择模块(MM-LSK)优化RT-DETR,构建可见光-红外双模态目标检测网络。在遥感等大尺寸图像的可见光-红外双模态小目标检测任务中,单模态检测易受光照、云雾、背景干扰等因素影响,且小目标外观信息匮乏,无法仅基于单模态外观实现较好的识别,因此需要融合双模态互补特性与广泛的跨模态上下文信息进行辅助。

Limiiiing的博客 382

14 ABSOLUTE评估肿瘤纯度

14 ABSOLUTE评估肿瘤纯度 Absolute介绍 ABSOLUTE可以直接从体细胞突变和拷贝数变异的结果中推断肿瘤纯度和倍性的计算方法。 通常来说,我们取肿瘤组织进行测序,往往是一个混合样品,既包括肿瘤细胞也包括正常细胞,因此需要进行肿瘤纯度 purity 的评估。当从混合样品中提取 DNA 进行测序后,得到的也是一个混合样品的结果。肿瘤不一定是单纯的二倍体了,其本身异质性高,存在部分突变部分不突变的情况,直接分析拷贝数变异,得到的结果并不准确,评估肿瘤倍性 ploidy 也更加必要。而 ABSO

qq_23435961的博客 4215

和gdi绘图效率比较_C#图形编程之GDI绘图:(二) 普通级之算法改进

在第一篇文章C#图形编程之GDI绘图:(一) 入门级 中我们介绍了我们的任务需求及如何绘制图片,但是效率很低,本篇文章我们将做一些优化,让任务执行的更高效。重新根据需求来分析代码: //绘制小方格,并根据坐标变化实现上移滚动效果 for (int i=0; i我们想要绘制的是满屏的、有间距的小方格,但上面的代码是每个像素都执行了一遍,然后做绘制,最大的l...

weixin_39989384的博客 467

Xiaojie雷达之路---手把手教你从串口获取雷达原始数据(一)---新建工程(开始)

Hello,大家好,我是Xiaojie,欢迎大家能够和Xiaojie来一起学习毫米波雷达知识,Xiaojie准备连载一个系列的文章---利用串口获取毫米波雷达中的原始数据,本系列文章将从新建工程到最后原始数据显示到PC上进行逐步介绍,这个系列的文章大约是一个4-5篇左右。本篇文章呢,主要讲的是如何新建一个毫米波雷达的工程。

XiaoJie的博客 5810

使用bitblt提高GDI+绘图的效率

最近在做使用GDI+绘制K线界面发现传统的GDI+绘制方式效率比较低,根本无法满足K线界面及时刷新的速度要求。所以做了个GDI+绘制图形界面的试验,改试验主要在一个600×600的区域内每隔10MS绘制60×60个点,每隔10MS改变其颜色,并记录每次绘制的帧数作为比较GDI+绘图性能的依据(这个界面是摘自网上)在这里定义个一个timer控件,刷新时间设为10ms,tick事件里写入一下代码Da...

weixin_34319999的博客 229

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

GDI 绘图的几个技巧

 1. 解决屏幕闪烁的双缓冲技术:1) 将所要绘制的元素一次性绘制到后台DC,然后将后台DC拷贝到屏幕DC上.2) 重写擦除窗体背景函数BOOL OnEraseBkgnd(CDC* pDC) ,直接return tuere.2.用对象来管理GDI对象:在构造函数中创建GDI对象,在析构函数中释放.3. 脏矩形技术实现快速平滑的动画绘制,实现步骤:1)将背景窗口内容拷贝到一个内存DC中d

it_fly的专栏 2422

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

陈灯WGF双缓冲绘图框架之gdi及gdiplus实现双缓冲时存在的效率问题及解决办法

a)    双缓冲绘图潜在的效率问题    双缓冲刷新技术是一项解决刷屏时存在的屏幕闪烁问题的有效方法。这种方法通过将图形绘制在与窗口设备上下文兼容的后备缓冲区中然后通过内存拷贝到前端缓冲区进行显示的方式实现。双缓冲刷新技术通常在需要进行实时图形显示的情况下使用,因为屏幕闪烁问题在高速刷新的情况下较为明显。如果将所有的绘图场景不加区分的在每一次刷新时都进行重绘,双缓冲刷新技术是低效的,

陈灯的博客 2775

GDI-03-绘图api上

记得用完之后删除。 但是这样画出的矩形不是我们想要的,因为它不是一个框。如下: 那如何处理呢? 获取库存的GDI对象.

FairLikeSnow的博客 177

使用GDI绘制像素矩阵与像素缓冲区

使用GDI绘制像素矩阵与像素缓冲区

weixin_44444347的博客 3256

gdi+ 选择框的绘制

用过绘图软件的人都知道,当我们要选择多个对象的时候时常会用到一个矩形框选. 今天闲来无事就写一个这样的程序. 最主要的一个问题当刷新的时候,我们连同背景也要刷新一遍,这样使得效率非常的低。不知道在GDI+ 里面还有没有别的更加高效的方法。 绘制框先矩形的几点要注意: (1) 计算机左上角第一个点是(0,0),这点要非常留意,不像我们平时绘图的...

diaocuanluo4922的博客 315

GDI+绘图性能瓶颈,如何用System.Drawing实现毫秒级图像生成?

解决GDI+绘图性能瓶颈,掌握C# 图形处理:System.Drawing 进阶技巧,实现毫秒级图像生成。适用于高并发图表渲染与批量图片处理,通过双缓冲、Graphics优化与对象复用提升效率。性能提升显著,值得收藏。

CompiShoal的博客 844

linux获取窗口截图c语言,C语言 屏幕截图 (GDI)

截取全屏幕#include void echo(CHAR *str);int CaptureImage(HWND hWnd, CHAR *dirPath, CHAR *filename);int main(){echo(TEXT("Ready"));CaptureImage(GetDesktopWindow(), "E:\", "screen"); // 保存为 E:screen.bmpecho(...

weixin_32549267的博客 850
上一篇: 解决VS2008中MFC静态编译出来的文件太大问题
下一篇: warning C4307: '+' : integral constant overflow或warning C4307: “+”: 整型常量溢出
debehe
博客等级 码龄22年 38粉丝 67原创
评论 8
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值