日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

StretchBlt和StretchDIBits

發布時間:2023/12/19 综合教程 29 生活家
生活随笔 收集整理的這篇文章主要介紹了 StretchBlt和StretchDIBits 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

StretchBlt:從源矩形中復制一個位圖到目標矩形,必要時按目標設備設置的模式進行圖像的拉伸或壓縮,如果目標設備是窗口DC,則意味著在窗口繪制位圖,大致的使用代碼如下:

 1 void DrawImage(HDC hdc, HBITMAP hbm, const RECT target_rect)
 2 {
 3     HDC hdcMemory = ::CreateCompatibleDC(hdc);
 4     HBITMAP old_bmp = (HBITMAP)::SelectObject(hdcMemory, hbm);
 5 
 6     BITMAP bm = { 0 };
 7     ::GetObject(hbm, sizeof(bm), &bm);
 8 
 9     ::StretchBlt(
10         hdc,                              // Target device HDC
11         target_rect.left,                   // X sink position
12         target_rect.top,                    // Y sink position
13         target_rect.right - target_rect.left,    // Destination width
14         target_rect.bottom - target_rect.top,    // Destination height
15         hdcMemory,                               // Source device HDC
16         0,                                // X source position
17         0,                               // Y source position
18         bm.bmWidth,                        // Source width
19         bm.bmHeight,                        // Source height
20         SRCCOPY);                                // Simple copy
21 
22     ::SelectObject(hdcMemory, old_bmp);
23     ::DeleteObject(hdcMemory);
24 }

StretchDIBits:該函數將DIB(設備無關位圖)中矩形區域內像素使用的顏色數據拷貝到指定的目標矩形中,如果目標設備是窗口DC,同樣意味著在窗口繪制位圖,大致的使用代碼如下:

 1 void DrawImage(HDC hdc, LPBITMAPINFOHEADER lpbi, void* bits, const RECT target_rect)
 2 {
 3     ::StretchDIBits(
 4         hdc,                                    // Target device HDC
 5         target_rect.left,                       // X sink position
 6         target_rect.top,                        // Y sink position
 7         target_rect.right - target_rect.left,   // Destination width
 8         target_rect.bottom - target_rect.top,   // Destination height
 9         0,                                      // X source position
10         0,                                      // Adjusted Y source position
11         lpbi->biWidth,                       // Source width
12         abs(lpbi->biHeight),                 // Source height
13         bits,                                   // Image data
14         (LPBITMAPINFO)lpbi,                     // DIB header
15         DIB_RGB_COLORS,                         // Type of palette
16         SRCCOPY);                               // Simple image copy 
18 }

簡單的講,StretchBlt操作的是設備相關位圖是HBITMAP句柄,StretchDIBits操作的是設備無關位圖是內存中的RGB數據。

DirectShow示例代碼中的CDrawImage類提供了FastRender和SlowRender兩個函數用于渲染視頻圖像,FastRender用的StretchBlt,SlowRender用的StretchDIBits,其中SlowRender的注釋是這樣寫的:

1 // This is called when there is a sample ready to be drawn, unfortunately the
2 // output pin was being rotten and didn't choose our super excellent shared
3 // memory DIB allocator so we have to do this slow render using boring old GDI
4 // SetDIBitsToDevice and StretchDIBits. The down side of using these GDI
5 // functions is that the image data has to be copied across from our address
6 // space into theirs before going to the screen (although in reality the cost
7 // is small because all they do is to map the buffer into their address space)

也就是說StretchDIBits比StretchBlt多消耗了從內存地址空間拷貝圖像數據到GDI地址空間的時間。實際測試結果在XP和Win7系統下兩者效率幾乎沒有區別,所以可以放心大膽的使用StretchDIBits,畢竟內存數據處理起來要方便的多。

轉載于:https://www.cnblogs.com/xrunning/p/3647046.html

總結

以上是生活随笔為你收集整理的StretchBlt和StretchDIBits的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。