设为首页 加入收藏

TOP

1.5.2 图像的扫描显示
2013-10-07 00:23:34 来源: 作者: 【 】 浏览:71
Tags:1.5.2 图像 扫描 显示

1.5.2  图像的扫描显示

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

/**********************************************
****************************
*函数名:
*    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 DC
int XDest,                    // x-coord of destination
upper-left corner
int YDest,                    // y-coord of destination
upper-left corner
int nDestWidth,               // width of destination rectangle
int nDestHeight,              // height of destination rectangle
int XSrc,                     // x-coord of source
upper-left corner
int YSrc,                     // y-coord of source
upper-left corner
int nSrcWidth,                // width of source rectangle
int nSrcHeight,               // height of source rectangle
CONST VOID *lpBits,           // bitmap bits
CONST BITMAPINFO *lpBitsInfo, // bitmap data
UINT iUsage,                  // usage options
DWORD 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);
}

扫描显示的效果如图1-25所示。
 
(点击查看大图)图1-25  扫描显示的效果

【责任编辑:夏书 TEL:(010)68476606】

回书目   上一节   下一节

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇1.5.4 图像的渐进显示 下一篇5.1.2 CImgEnhance类的构造函数和..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: