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)是客户区的左上角,即从上往下。

 

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • WPF随笔(十)–使用AvalonDock实现可停靠式布局「建议收藏」

    WPF随笔(十)–使用AvalonDock实现可停靠式布局「建议收藏」许多软件都使用了可停靠式布局,可以方便的打开、关闭、收起、展开、移动选项卡。今天就来说明如何使用AvalonDock实现这种可停靠式布局。…

    2022年7月20日
    15
  • java calendar和date_java calendar获取年月日

    java calendar和date_java calendar获取年月日java中的Calendar类为什么起个名字就叫做日历呢?因为这个类可以让我们像看日历一样得到这个时间的所有属性,你还在为不知道2014年5月7日是周几而苦恼吗?你还在为2005年8月14日是8月的第几周而发愁吗?快来试一试Calendar吧。Calendar的常用属性属性作用YEAR年份MONTH月份DATE同DAY_OF_MONTH,日期DAY_…

    2022年9月23日
    0
  • 十进制的小数转换为二进制的方法_二进制转十进制公式

    十进制的小数转换为二进制的方法_二进制转十进制公式今天在学习十进制与二进制的相互转换,学到小数的十进制转换到二进制时,所以我想着能不能用我这菜鸡技术,利用C++来实现只把十进制小数转换成二进制。【思路】输入要计算的二进制小数部分“decimals”以及要计算出的二进制位数循环while()部分●进行小数*2的运算,只输出整数部分(获得二进制数值),这部分利用了floor()函数,它会返回比参数小的最大整数●把整数…

    2022年9月15日
    0
  • 腾讯 OCR 情况

    腾讯 OCR 情况

    2021年6月14日
    150
  • forkjoin使用_forkjoin与线程池区别

    forkjoin使用_forkjoin与线程池区别ForkJoinPoolinfoForkJoinPool=newForkJoinPool(Runtime.getRuntime().availableProcessors()*2);ForkJoinTask<Map<Long,InfoVO>>forkJoinTask=ThreadPoolManage.infoForkJoinPool.submit(newPriceTask(skuIds,0,skuIds.size(),infoSoaService));

    2022年9月20日
    0
  • linux怎么编写shell脚本_简单的shell脚本代码

    linux怎么编写shell脚本_简单的shell脚本代码用springboot框架做的项目,将第三方包全部打在jar里面,通过shell脚本启动和停止服务,常用的shell脚本模板如下:#!/bin/bashJAVA_OPTIONS_INITIAL=-Xms128MJAVA_OPTIONS_MAX=-Xmx512M_JAR_KEYWORDS=monitor-alarm-task-1.0-SNAPSHOT.jarAPP_NAME=monitor-al…

    2022年10月4日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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