用GDI+拖动超大图象时很缓慢,求解决方法。 比如内存中有一幅3xxx-2xxx的图在一个500~400的窗口中拖动会很慢,有明显的延迟现象 (P4 2.8C 512RAM)有什么方法能大副提高速度? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 根据当前滚动窗口和实际显示图像的大小,得到放大倍数,再依据当前滚动窗口的位置和客户区的大小,计算出要绘制到客户区的原始图像区域,然后再stretchblt或StretchDibToDevice.优点:绘制很快,缺点:放大倍数大一些时候,拖动会一个方块一个方块的显示,不能像ACDSee那样显示大图像也一样平滑. 只显示在可视部分的图像。不知为何,GDI+是多了很功能,但性能却不如GDI,就好比VMR-9还不如传统的VideoRender Graphics *gdcct=new Graphics(Screen->Canvas->Handle);//得到屏幕500x400CachedBitmap cachedBitmap(Temple, gdcct);//Temple是很大的图象gdcct->SetClip(Rect clip(0,0,Screen->Width,Screen->Height));//裁减显示区域gdcct->DrawCachedBitmap(&cachedBitmap, x, y);//写缓冲delete gdcct;我是这样的做的 拖动是指拉动滚动条么?ps GDI+是要慢一些,如果提高速度,可能需要你判断窗口的位置,只显示窗口位置的图片,,双缓存不知道是否管用了。。 如果某些范围的内容只是从一个地方拖动到另外一个地方的话, 用ScrollDC来可以大幅提高绘制速度. 然后你再去绘制那些新生成的地区. Screen->Canvas->Handle 不就是 HDC 么. Screen->Canvas->Handle 是最终画上去的地方 移动HDC是可以,但也只是一小块地方移动啊 在一个500~400的窗口中拖动会很慢_______你拖动时, 鼠标移动一下顶多50个象素, 剩下的 400*300 的图形都可以通过SCROLLDC来平滑地复制过去, 你只需要重画那些要完全绘制的部分.Screen->Canvas->Handle 是最终画上去的地方 ______SCROLLDC就是对这个操作的. 这个函数据功能说是显卡驱动提供的.直接在显卡缓存中完成复制 如果分块显示应该怎么操作?“鼠标移动一下顶多50个象素”我理解不了?另外能不能用directdraw 我觉得 GDI+ 注重于图像处理,比如Alpha透明等,如果要速度还是用 GDI 快点,当然DirectX 更快. to everandforever(Forever) 我试过了,还是很慢我发现并不是拖动screen的hdc造成的而是那幅很大的图->drawimage到screen的时候慢.也就是无论screen大小,只要是画到screen上,同样是很慢! 能看一下你的源码吗?应不会这么慢可能是你实现方法不得当呀..就用GDI我想也会很快了一张图最多不过几十M,而400*500的也不过最多几M.发来看看共同研究吧! 楼上的牛!!偶不懂GDI+编程啊,前半个月我说的那个方法是先做一个兼容内存DC,其中的cbitmap和客户区一样大小,首先计算出要显示在客户区的部分在源图像中是哪块区域,然后stretchDibsToDevice或StretchBlt到内存DC,最后再BitBlt到显示DC。缺点是:由于是计算源图像的哪块区域用了取整,拖动过程是“一个方块一个方块的拖动”,拖动效果不够平滑。偶又做了一个兼容内存DC,cbitmap是客户区的3倍大小,根据视口ScrollPos和ScrollSize,放置一个CRect表示当前客户区要显示的内容映射到cbitmap里的坐标,这样就可以平滑拖动了。 楼主能不能把你的拖动图片的源马给我看看啊.小弟也正要作一个提供这功能的FUNCTION,请帮忙,我送分你啊,多谢! GDI + 本来主慢,没办法 关于DLL劫持 用什么函数提取文件名 如何在组件中使用自定义消息? 怎样用VC语句获取所有的打印机名称(如果机器上连有多台)? Help Me!!!Help Me!!! 210分请教一个关于串行通信的问题,此贴10分,上次开的两个贴还有200 请问怎样对BSTR进行转换? 监视向服务器提交的数据? 知者易,不知者难!关于vc编译的问题! how to use SendMessage to send f1 VK_KEY 难得提问,总在为别人回答问题,这次提问希望大家帮忙 技术小问题,请大家帮忙,谢谢
不知为何,GDI+是多了很功能,但性能却不如GDI,就好比VMR-9还不如传统的VideoRender
CachedBitmap cachedBitmap(Temple, gdcct);//Temple是很大的图象
gdcct->SetClip(Rect clip(0,0,Screen->Width,Screen->Height));//裁减显示区域
gdcct->DrawCachedBitmap(&cachedBitmap, x, y);//写缓冲
delete gdcct;我是这样的做的
,双缓存不知道是否管用了。。
移动HDC是可以,但也只是一小块地方移动啊
_______
你拖动时, 鼠标移动一下顶多50个象素, 剩下的 400*300 的图形都可以通过SCROLLDC来平滑地复制过去, 你只需要重画那些要完全绘制的部分.Screen->Canvas->Handle 是最终画上去的地方
______
SCROLLDC就是对这个操作的. 这个函数据功能说是显卡驱动提供的.直接在显卡缓存中完成复制
我试过了,还是很慢
我发现并不是拖动screen的hdc造成的
而是那幅很大的图->drawimage到screen的时候慢.
也就是无论screen大小,只要是画到screen上,同样是很慢!
就用GDI我想也会很快了一张图最多不过几十M,而400*500的也不过
最多几M.发来看看共同研究吧!
偶不懂GDI+编程啊,前半个月我说的那个方法是先做一个兼容内存DC,其中的cbitmap和客户区一样大小,首先计算出要显示在客户区的部分在源图像中是哪块区域,然后stretchDibsToDevice或StretchBlt到内存DC,最后再BitBlt到显示DC。缺点是:由于是计算源图像的哪块区域用了取整,拖动过程是“一个方块一个方块的拖动”,拖动效果不够平滑。
偶又做了一个兼容内存DC,cbitmap是客户区的3倍大小,根据视口ScrollPos和ScrollSize,放置一个CRect表示当前客户区要显示的内容映射到cbitmap里的坐标,这样就可以平滑拖动了。