扫描是最基本的特效显示方式,它没有划分图像块,只是顺序地一行一行或一列一列地显示图像。下面的程序是向下扫描的代码实现。
/函数名: 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=0;j<bitmapHeight;j++)//扫描特效显示的具体算法{::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);
//调用扫描程序,传递设备环境指针
SpShowScan(&aDC);
}
以上就是关于如何通过C++编程实现扫描图像。全部的内容,包括:如何通过C++编程实现扫描图像。、、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)