如何通过C++编程实现扫描图像。

如何通过C++编程实现扫描图像。,第1张

扫描是最基本的特效显示方式,它没有划分图像块,只是顺序地一行一行或一列一列地显示图像。下面的程序是向下扫描的代码实现。

/***************************************************************************函数名:*Scan(CDC *pDC)**函数参数:*CDC *pDC-指向设备环境的指针,用于显示位图数据**返回值:*无**说明:该函数实现了图像的扫描显示的效果**************************************************************************/void SpecialEffectShow::Scan(CDC *pDC) //扫描显示一幅图像{int bitmapWidth=GetDimensions().cx//获得源图像的宽度,以像素为单位int bitmapHeight=GetDimensions().cy//获得源图像的高度,以像素为单位 CRect rect(0,0,bitmapWidth,bitmapHeight)//以源图像的尺寸创建一个矩形CBrush brush(RGB(255,255,255))//设置画刷为白色pDC->FillRect(&rect,&brush)//将已经显示出来的原图像重新设置成白色,达到刷新屏幕的效果 LPBITMAPINFO pBitmapInfo=(BITMAPINFO*)m_lpBmpInfoHead//为适应StretchDIBits函数的需要,将图像信息头指针强制转换为LPBITMAPINFO类型 for(int j=0j<bitmapHeightj++)//扫描特效显示的具体算法{::StretchDIBits(pDC->GetSafeHdc(),0, j, bitmapWidth, 1,0, bitmapHeight-j, bitmapWidth, 1,m_pImgData, pBitmapInfo,DIB_RGB_COLORS, SRCCOPY)Sleep(3)//设置延时}}

以上代码主要调用了StretchDIBits()函数,在SpecialEffectShow类的其他特效显示中也都调用了该函数。StretchDIBits函数是全局的Win32 API函数,它的作用是拷贝源位图中的一个矩形区域的数据,然后显示到目标设备环境中的一个矩形中,如果源矩形和目标矩形的大小不一样,StretchDIBits函数有压缩或拉伸源位图的功能。以下是该函数参数的说明。

int StretchDIBits(HDC hdc, // handle to DCint XDest,// x-coord of destination upper-left cornerint YDest,// y-coord of destination upper-left cornerint nDestWidth, // width of destination rectangleint nDestHeight, // height of destination rectangleint XSrc, // x-coord of source upper-left cornerint YSrc, // y-coord of source upper-left cornerint nSrcWidth,// width of source rectangleint nSrcHeight, // height of source rectangleCONST VOID *lpBits, // bitmap bitsCONST BITMAPINFO *lpBitsInfo, // bitmap dataUINT iUsage, // usage optionsDWORD dwRop // raster operation code)

HDC hdc:目标设备环境句柄;

XDest:目标矩形左上角的X坐标,坐标是逻辑单位,在MM_TEXT映射模式下,一个逻辑单位为一个像素(有关映射模式的问题,请读者参考其他图书或MSDN);

YDest:目标矩形左上角的Y坐标,坐标是逻辑单位;

nDestWidth:目标矩形的宽度,坐标是逻辑单位;

nDestHeight:目标矩形的高度,坐标是逻辑单位;

XSrc:指定源位图图像矩形的左上角的X坐标,坐标单位是图像的像素;

YSrc:指定源位图图像矩形的左上角的Y坐标,坐标单位是图像的像素;

nSrcWidth:源位图图像矩形的宽度,坐标单位是图像的像素;

nSrcHeight:源位图图像矩形的高度,坐标单位是图像的像素;

lpBits:源位图数据指针;

lpBitsInfo:指向源位图的BITMAPINFO结构的指针;

iUsage:函数使用方式,详细参数说明请参考MSDN;

dwRop:当使用压缩或拉伸功能时所使用的光栅模式,详细参数说明请参考MSDN。

我们在视图类CChap1_6View中映射“扫描显示”菜单事件处理函数OnScan(),程序运行时,点击“扫描显示”菜单即可实现图像的扫描显示效果。下面是CChap1_6View:: OnScan()的代码。

void CChap1_6View::OnScan() {//获取文档类中m_dib的指针,访问当前DIB数据CChap1_6Doc *pDoc=GetDocument()ImgCenterDib *pDib=pDoc->GetPDib()

//只处理彩色图像或灰度图像

if(pDib->m_nBitCount!=24&&pDib->m_nBitCount!=8){

::MessageBox(0,"只处理彩色和灰度图像",MB_OK,0)

return

}

//定义SpecialEffectShow类的对象SpShow,用当前DIB数据为其初始化

SpecialEffectShow SpShow(pDib->GetDimensions(),

pDib->m_nBitCount,pDib->m_lpColorTable,pDib->m_pImgData)

//获得设备环境变量

CClientDC aDC(this)

//调用扫描程序,传递设备环境指针

SpShow.Scan(&aDC)

}

采用中断方式编程,与键扫描方式,哪个更简单

一键扫描方式更简单

在单片机设计过程中,有时需要依靠键盘输入的支持。这就需要进行识别按键技术,在本文当中,小编将为大家介绍识别键盘的常见方法、盘的编码、以及单片机系统中键盘系统的工作方式。感兴趣的朋友快来看一看吧。

在实际应用中,识别按键的方法是非常多的,其中最常见的方法是扫描法。当按键按下,与此键相连的行线与列线导通,行线在无键按下时处在高电平。如果让所有的列线也处在高电平,那么按键按下与否不会引起行线电平的变化,因此必须使所有列线处在低电平。只有这样,在有键按下时该键所在的行电平才会由高电平变为低电平。CPU根据行电平的变化,便能判定相应的行有键按下。

键盘的编码

对于独立式按键键盘,因按键数量少,可根据实际需要灵活编码。对于矩阵式键盘,按键的位置由行号和列号惟一确定,因此可分别对行号和列号进行二进制编码,然后将两值合成一个字节,高4位是行号,低4位是列号。

键盘的工作方式

对键盘的响应取决于键盘的工作方式,键盘的工作方式应根据实际应用系统中CPU的工作状况而定,其选取的原则是既要保证CPU能及时响应按键 *** 作,又不要过多占用CPU的工作时间。通常键盘的工作方式有三种,即编程扫描、定时扫描和中断扫描。

1、编程扫描方式

编程扫描方式是利用CPU完成其它工作的空余时间,调用键盘扫描子程序来响应键盘输入的要求。在执行键功能程序时,CPU不再响应键输入要求,直到CPU重新扫描键盘为止。

2、定时扫描方式

定时扫描方式就是每隔一段时间对键盘扫描一次,它利用单片机内部的定时器产生一定时间(例如10ms)的定时,当定时时间到就产生定时器溢出中断。CPU响应中断后对键盘进行扫描,并在有键按下时识别出该键,再执行该键的功能程序。

3、中断扫描方式

采用上述两种键盘扫描方式时,无论是否按键,CPU都要定时扫描键盘,而单片机应用系统工作时,并非经常需要键盘输入,因此,CPU经常处于空扫描状态。

中断模式适合在需要提升工作效率最大化的情况中使用,当采用中断模式时,如果没有按键按下,那么CPU会针对自己的工作进行处理,但如果按键被按下,则产生了中断请求,此时CPU就会主动执行针对键盘的子程序扫描,并对键号进行键盘识别。这样便能大大加强效率。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/11076851.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-13
下一篇2023-05-13

发表评论

登录后才能评论

评论列表(0条)

    保存