发布网友 发布时间:2022-04-22 19:27
共2个回答
热心网友 时间:2022-04-06 13:49
这是老师给的高大上的东西:
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/6+WithFalg)*(bitmapHeight/6+HeightFlag);
//将图象宽高都延拓至12的整数倍,然后将图象分成12X12的小块,按行顺序排列成一个数组
struct Square
{
CPoint pt;//记录每个12X12的小块的左上角坐标
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;
}
热心网友 时间:2022-04-06 15:07
这种例子很多书上都有的,
你去书店或者有图书馆的话去找找,
肯定可以找到
我看过的一些书里
清华大学出版社的《Visual C++.NET数字图像处理实例与解析》
人民邮电出版社的《Visual C++程序开发范例宝典》
都有这段程序。