StretchDIBits函数显示图片

StretchDIBits函数显示图片注:转载请注明出处。函数原型intStretchDIBits(HDChdc,intXDest,intYDest,intnDestWidth,intnDestHeight,intXSrc,intYsrc,intnSrcWidth,intnSrcHeight,CONSTVOID*lpBits,CONSTBITMAPINFO*lpBitsInfo,UINTiUs…

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

注:转载请注明出处。

函数原型

int StretchDIBits(HDC hdc,int XDest,int YDest,int nDestWidth,int nDestHeight,int XSrc,int Ysrc,int nSrcWidth,int nSrcHeight,CONST VOID * lpBits,CONST BITMAPINFO * lpBitsInfo,UINT iUsage,DWORD dwRop); HDC:指向设备的目标环境句柄

该函数将DIB矩形中区域内像素使用的颜色数据拷贝到指定的目标矩形中。

XDest:指定目标矩形左上角位置的X轴坐标,按逻辑单位来表示坐标。

YDest:指定目标矩形左上角的Ÿ轴坐标,按逻辑单位表示坐标。

nDestWidth:指定目标矩形的宽度本程序要显示的矩形宽:IMGWIDTH  

nDestHeight:指定目标矩形的高度本程序要显示的矩形高:IMGHEIGHT

XSrc:指定DIB中源矩形(左上角)的X轴坐标,坐标以像素点表示。 

YSrc:指定DIB中源矩形(左上角)的Ÿ轴坐标,坐标以像素点表示。 

nSrcWidth:按像素点指定DIB中源矩形的宽度。    

nSrcHeight:按像素点指定DIB中源矩形的高度。 

LP位元:指向DIB的位指针,位这些值的字节按类型数组存储,有关更多的信息。

lpBitsInfo:指向BITMAPINFO结构的指针,该结构包含有关DIB方面的信息。

iUsage:表示是否提供了BITMAPINFO结构中的成员bmiColors,如果提供了,那么该bmiColors是否包含了明确的RGB。值或索引其他参数自己可以百度百科。

例子:

void CImgShow :: Draw(CDC * pDC)

{CRect dcrect;
    GetClientRect(&dcrect);
    CDC memDC; //兼容DC对象
    CBitmap Membitmap; //兼容位图对象

    memDC.CreateCompatibleDC(PDC); //创建兼容DC    
    Membitmap.CreateCompatibleBitmap(pDC,dcrect.Width(),dcrect.Height()); //创建兼容位图
    memDC.SelectObject(&Membitmap); //将兼容位图选入兼容dc
    memDC.FillSolidRect(dcrect,RGB(255,255,255)); 
    memDC.SetStretchBltMode(COLORONCOLOR);

    :: StretchDIBits(memDC.GetSafeHdc(),0,0,IMGWIDTH,IMGHEIGHT, 
        0,IMGHEIGHT,IMGWIDTH,-IMGHEIGHT,m_lpImage,m_lpImgInfo, 
        DIB_RGB_COLORS,SRCCOPY);

    pDC-> BitBlt(0,0,dcrect.Width(),dcrect.Height(),&memDC,0,0,SRCCOPY);
    memDC.DeleteDC();
    Membitmap.DeleteObject();

}

这里只对的的StretchDIBits函数进行讲解。

 :: StretchDIBits(memDC.GetSafeHdc(),0,0,IMGWIDTH,IMGHEIGHT,0,IMGHEIGHT,IMGWIDTH,-IMGHEIGHT,m_lpImage,m_lpImgInfo,DIB_RGB_COLORS,SRCCOPY);

 

 

图像原图如图1。

 StretchDIBits函数显示图片

                                                                        图1原图

1,:: StretchDIBits(memDC.GetSafeHdc(),0,0,dcrect.Width(),dcrect.Height(),0,0,m_nImgWidth,m_nImgHeight,m_lpImage,m_lpImgInfo,DIB_RGB_COLORS,SRCCOPY);

这时,图像是倒立的,因为是指定原图坐标原点是(0,0)中,Y轴向上为正。坐标轴如图1而原图的OpenCV中的图像数据是从下往上读取,所以,图像的最底部数据是(X,Y)是依次增大,被最后读取。对应到DIB上,图像就倒立了。显示结果如图2

StretchDIBits函数显示图片

                                                                             图2显示结果

 

2.为了解决上述问题,将图像的坐标原点放在(0,srcHeight)中,Y轴翻转,则图像的高度变为负数,坐标轴如图3所示。这时,自顶向下DIB的起始点为左上角。与原图的扫描方式一样,图像正常显示,结果如图4所示

    :: StretchDIBits(memDC.GetSafeHdc(),0,0,dcrect.Width(),dcrect.Height(),0,m_nImgHeight,m_nImgWidth,-m_nImgHeight,m_lpImage,m_lpImgInfo,DIB_RGB_COLORS,SRCCOPY);

StretchDIBits函数显示图片

                                                                       图3坐标轴 

          StretchDIBits函数显示图片

                                                        图4结果显示。

最后利用的BitBlt的的函数,将DIB矩形内的图像贴到当前DC中。设备空间和物理设备空间中(0,0)是客户区的左上角,即从上往下。

 

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

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

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

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

(0)
blank

相关推荐

  • Alex 的 Hadoop 菜鸟教程: 第3课 Hadoop 安装教程 – 非HA方式 (一台服务器)「建议收藏」

    Alex 的 Hadoop 菜鸟教程: 第3课 Hadoop 安装教程 – 非HA方式 (一台服务器)「建议收藏」本教程是在Centos6下使用yum来安装CDH5版本的hadoop的教程,适合新手并且只有一个linux服务器的情况下最快速度的上手hadoop

  • 创建xsync 脚本

    创建xsync 脚本1、安装rsync:yum-yinstallrsync2、创建xsync文件并进行编辑(最好放到配置过环境变量的目录下)输入命令:vi/usr/local/spark/spark-standalone/bin/xsync#!/bin/bash#1获取输入参数个数,如果没有参数,直接退出pcount=$#if[$pcount-lt1]thenechoNoEnoughArguement!exit;fi#2.遍历集群所有机器forh…

  • C# DateTimePicker:日期时间控件「建议收藏」

    C# DateTimePicker:日期时间控件「建议收藏」日期时间控件(DateTimePicker)在时间控件中的应用最多,主要用于在界面上显示当前的时间。Format属性提供了4个属性值,如下所示。Short:短日期格式,例如2017/3/1;Long:长日期格式,例如2017年3月1日;…

  • 用好SVN与Git,版本管理都不是问题

    用好SVN与Git,版本管理都不是问题

  • SpringCloud SpringCloud与Dubbo的区别

    SpringCloud SpringCloud与Dubbo的区别(1)SpringCloud与Dubbo的服务治理框架全局性对比(2)最大的区别:SpringCloud抛弃了Dubbo的RPC通信,采用了基于HTTP的REST方式。严格来说,这两种方式各有优劣,虽然从一定程度上来说,后者牺牲了服务调用的性能,但是也避免了RPC带来的问题,并且REST相比RPC更为灵活,服务提供方和调用方的依赖只依靠一纸协议,不存在代码的强依赖性,这在强调快速演化稍…

  • 强大的nginx反向代理异步传输模式(原理)[通俗易懂]

    强大的nginx反向代理异步传输模式(原理)[通俗易懂]sudone.com在nginx的反向代理介绍中,提到了异步传输模式并提到它可以减少后端连接数和压力,这是为何?下面就来讲解下传统的代理(apache/squid)的同步传输和nginx的异步传输的差异。看图:         squid同步传输:浏览器发起请求,而后请求会立刻被转到后台,于是在浏览器和后台之间就建立了一个通道。在请求发起直到请求完成,这条通道都是一直存在的。nginx异步传输:浏…

发表回复

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

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