求教大神,本人使用MFC自己写了一个picture控件,使用GDI的 StrechDIBits()函数绘图,在画大图时速度很慢,3亿像素的8位bmp图,画一次要2000 -2400毫秒也就是2秒以上了。但是用公司的库绘图只要6-20毫秒就能完成,我想问问有什么解决办法吗,是我的问题还是函数本身的问题,或者有什么优化的方法吗。 SYSTEMTIME TimeStart, TimeEnd;
GetLocalTime(&TimeStart);//起始时间
StretchDIBits(pDC->GetSafeHdc(), 0, 0, rcRect.Width(), rcRect.Height(), 
dImageXStartPos, dImageYStartPos, 
(int)(GetBitMapInfoHeader().biWidth / m_dZoomWidth), (int)(GetBitMapInfoHeader().biHeight /
                                 m_dZoomHeight), 
 m_pcBufImage, (BITMAPINFO*)m_pBitmapInfo_8, DIB_RGB_COLORS, SRCCOPY);
GetLocalTime(&TimeEnd);//结束时间
float fDetaTime = TimeEnd.wMilliseconds - TimeStart.wMilliseconds + 1000 * (TimeEnd.wSecond - TimeStart.wSecond);

解决方案 »

  1.   

    把StretchDIBits第一个参数换成内存DC,另外最好操作像素的时候直接在内存位图中操作即可,转成DIB格式,直接给memcpy修改像素点
      

  2.   

    类似与双缓冲的机制,用一个内存DC保存图片,DC到DC之间的操作很快。
      

  3.   

    改D2D吧,我最近也在用,C:\Program Files (x86)\Microsoft Visual Studio 10.0\Samples\2052\VC2010SP1Samples.zip中有好多例子
      

  4.   

    这个api我以前用过,确实很耗时,建议你找找有没有好点的第三方库
      

  5.   

    我已经解决了,确实halftone耗时严重,用了内存DC+StretchDIBits可以防止屏幕闪烁,但StretchDIBits速度一样慢的。我改用了STRETCH_DELETESCANS速度和公司库一样快了,但3亿大图缩小后有些失真,但是看了公司的库,同样失真,公司库比STRETCH_DELETESCANS缩小时的效果略好而已,只是略好,用的方法估计也是缩小直接是按比例抽取像素,并非差值。我做的是鼠标拖动图片,放大,缩小,小图片无所谓,大图像很慢,找不明白原因。其实StretchDIBits这个函数本身HALFTONE模式确实很慢,但是效果还是很好的。如果想做的效果更好,估计需要换一种工具了。
      

  6.   

    谢谢大家,总结一下,想快又想不失真那么估计wingdi还是略差,可以试试其他比如dx,OpenGL