设为首页 加入收藏

TOP

1.5.5 图像的马赛克显示
2013-10-07 00:23:43 来源: 作者: 【 】 浏览:90
Tags:1.5.5 图像 马赛克 显示

1.5.5  图像的马赛克显示

马赛克显示是图像被分成许多小区域,显示时候小区域以杂乱无章的顺序显示在屏幕上。马赛克显示是比较难的特效,它的图像分块和显示都比较复杂。其编程(www.cppentry.com)思想是:先将图像分成大小相同的小区域,计算出每一块区域的首地址,并记录下来。设置一个随机数,用来产生随机显示区域的次序,每获得一个随机区域,就根据首地址显示这块区域的图像,直至所有的区域都至少显示一次。

/****************************************
**********************************
*函数名:
*    Mosaic(CDC *pDC)
*
*函数参数:
*    CDC *pDC-指向设备环境的指针,用于显示位图数据
*
*返回值:
*    无
*
*说明:该函数实现了图像的马赛克显示的效果
*****************************************
*********************************/
void SpecialEffectShow::Mosaik(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类型

//马赛克的大小设置为宽高都是12个像素
int WithFalg=0; //图像宽是12的整数倍的标志
int HeightFlag=0;//图像高是12的整数倍的标志
if((bitmapWidth%12)!=0)WithFalg=1;
if((bitmapHeight%12)!=0)HeightFlag=1;
long ArrayLength=(bitmapWidth/12+WithFalg)
*(bitmapHeight/12+HeightFlag);
//将图像宽高都延拓至12的整数倍,然后将图像
分成1212的小块,按行顺序排列成一个数组
 struct Square
{
CPoint pt;//记录每个1212的小块的左上角坐标
bool HitFlag;//当随机扫描所有小块的时候,
记录是否曾经被扫描过
};//自己定义一个结构,由一个Cpoint类型和一个击中标志构成
 Square* SquareArray=new Square[ArrayLength];
int x=0;
int y=0;
 for(int i=0; i<ArrayLength; i++)
{
//初始化每个小块的坐标点
SquareArray[i].pt.x=x;
SquareArray[i].pt.y=y;
x=x+12;
if(x>bitmapWidth)
{x=0;y=y+12;}
  //初始所有小块都未被击中过
SquareArray[i].HitFlag=FALSE;
}

long RandNum;//随机变量
srand( (unsigned)time( NULL ) );//生成随机种子
for(i=0;i<=ArrayLength;i++)

do
{
RandNum=(long)( ( (double)ArrayLength )
*rand()/RAND_MAX );//随机变量在0到ArrayLength-1之间取值
x=SquareArray[RandNum].pt.x;
y=SquareArray[RandNum].pt.y;  
}while(SquareArray[RandNum].HitFlag==TRUE);//
检查小块以前是否被击中过,如果是,重新计算一个随机数
SquareArray[RandNum].HitFlag=TRUE;//设置击中标志
  ::StretchDIBits(pDC->GetSafeHdc(),
x, y, 12,12,
x,bitmapHeight-y-12, 12,12,
m_pImgData, pBitmapInfo,DIB_RGB_COLORS, SRCCOPY);
Sleep(1);//设置延时时间
}
delete [] SquareArray;
}

在视图类CChap1_6View中映射“马赛克”菜单事件处理函数OnMosaic(),该函数的实现与前面“扫描显示”菜单事件处理函数CChap1_6View::OnScan()相类似,限于篇幅,此处不赘述,感兴趣的读者可以运行程序,查阅相关代码。程序运行时,点击“马赛克”菜单,效果如图1-28所示。

 
(点击查看大图)图1-28  马赛克显示的效果
本书内容涉及几何变换、正交变换、图像分割及形态学等多类典型图像算法,正如1.5节开头所述,每一类图像算法都是以ImgCenterDib为基类进行派生的,为了程序的集成性,这些算法都是在一个统一的应用程序框架demo下实现的。通过本章的学习,读者已经清楚如何用基类ImgCenterDib派生出新的类来实现同一类图像算法的封装和调用,因此,在后面章节中,我们将直接在综合应用程序框架demo下介绍图像的各类算法。
【责任编辑:夏书 TEL:(010)68476606】

回书目   上一节   下一节

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇4.4.2 静态常量 下一篇1.5.3 图像的滑动显示

评论

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