前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >StretchDIBits函数显示图片

StretchDIBits函数显示图片

作者头像
全栈程序员站长
发布2022-07-04 09:13:26
3K0
发布2022-07-04 09:13:26
举报
文章被收录于专栏:全栈程序员必看

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

注:转载请注明出处。

函数原型

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函数显示图片
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函数显示图片
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函数显示图片
StretchDIBits函数显示图片

图3坐标轴

StretchDIBits函数显示图片
StretchDIBits函数显示图片

图4结果显示。

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

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 函数原型
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档