求教大神,本人使用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);
uj5u.com熱心網友回復:
把StretchDIBits第一個引數換成記憶體DC,另外最好操作像素的時候直接在記憶體位圖中操作即可,轉成DIB格式,直接給memcpy修改像素點uj5u.com熱心網友回復:
在記憶體DC繪,再拷貝uj5u.com熱心網友回復:
改用DX ?uj5u.com熱心網友回復:
2樓兄弟能不能回復的具體點uj5u.com熱心網友回復:
類似與雙緩沖的機制,用一個記憶體DC保存圖片,DC到DC之間的操作很快。uj5u.com熱心網友回復:
改D2D吧,我最近也在用,C:\Program Files (x86)\Microsoft Visual Studio 10.0\Samples\2052\VC2010SP1Samples.zip中有好多例子uj5u.com熱心網友回復:
這個api我以前用過,確實很耗時,建議你找找有沒有好點的第三方庫uj5u.com熱心網友回復:
我已經解決了,確實halftone耗時嚴重,用了記憶體DC+StretchDIBits可以防止螢屏閃爍,但StretchDIBits速度一樣慢的。我改用了STRETCH_DELETESCANS速度和公司庫一樣快了,但3億大圖縮小后有些失真,但是看了公司的庫,同樣失真,公司庫比STRETCH_DELETESCANS縮小時的效果略好而已,只是略好,用的方法估計也是縮小直接是按比例抽取像素,并非差值。我做的是滑鼠拖動圖片,放大,縮小,小圖片無所謂,大影像很慢,找不明白原因。其實StretchDIBits這個函式本身HALFTONE模式確實很慢,但是效果還是很好的。如果想做的效果更好,估計需要換一種工具了。
uj5u.com熱心網友回復:
謝謝大家,總結一下,想快又想不失真那么估計wingdi還是略差,可以試試其他比如dx,OpenGL轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/79632.html
標籤:圖形處理/算法
上一篇:無法在MFC單檔案下 多個執行緒中 呼叫行程外COM組件
下一篇:求救
