StretchBlt和StretchDIBits

StretchBlt和StretchDIBitsStretchBlt:从源矩形中复制一个位图到目标矩形,必要时按目标设备设置的模式进行图像的拉伸或压缩,如果目标设备是窗口DC,则意味着在窗口绘制位图,大致的使用代码如下:1voidDrawImage(HDChdc,HBITMAPhbm,constRECTtarget_rect)2{3HDChdcMemory=::CreateCom…

大家好,又见面了,我是你们的朋友全栈君。

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/148100.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 计算机类单位换算,计算机单位换算大全「建议收藏」

    计算机类单位换算,计算机单位换算大全「建议收藏」电脑世界是由0与1组成,其中有数以万计的线路,一条线路传递一个信号,而0代表没有信号,1代表有信号,就像电源开关一样,同一时间只可能有一种状态,所以电脑最基本的单位就是一条线路的信号,我们就把它称作“位”,英文叫做bit,缩写为b。“位”和“字节”其实都是电脑的计量单位,我们可以理解成字节是由位组成的,一个“字节”等于8“位”,Byte是它的缩写.位(bit)这个单位太小,所以字节(Byte)是…

  • 格式化hdfs的命令_hadoop的启动命令

    格式化hdfs的命令_hadoop的启动命令总结:上传文件:put、copyFromLocal、moveFromLocal下载文件:get、copyToLocal、moveToLocal查看文件:text、cat、tail合并文件:getmerge命令详解HDFS命令基本格式:hadoopfs-cmd<args>表格:选项名称使用格式含义-ls-ls查看指定路径的当前目录结构-lsr-lsr递归查看指定路径的目录结…

  • laravel-admin 安装(总结)

    laravel-admin 安装(总结)

    2021年10月29日
  • c# AD域 权限管理

    c# AD域 权限管理我现在开始第一步,获取AD域用户所在的组,因为我想把菜单和界面按钮的功能由角色组来控制,用户加入角色组就可以获得相应的权限.这是我的思路.第一如何关联AD域并获取当前登录域的用户所在的角色组 ADUserMessage()代码如下:usingSystem;usingSystem.Collections.Generic;usingSystem.DirectorySer

  • google地图怎么下载离线地图_谷歌瓦片行列号算经纬度

    google地图怎么下载离线地图_谷歌瓦片行列号算经纬度谷歌地图离线地图瓦片下载Ifyou’veeverwantedtobeabletodownloadGoogleMapsdataforofflineuse,youshouldcheckoutgmapcatcher,across-platformapplicationthatcachesmapsegmentslocally.如果您曾经希望能够下载…

  • MATLAB 2017b 安装教程 (推荐)

    MATLAB 2017b 安装教程 (推荐)MATLAB2017b安装教程matlab2017b安装包及安装教程链接:https://pan.baidu.com/s/1riEvbTQnDSeo7bhix7YLZQ密码:z4em本Markdown编辑器使用[Sta**重点内容**ckEdit][6]修改而来,用它写博客,将会带来全新的体验哦:Matlab安装教程:1、下载文件,得到破解文件。*点…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号