求VC++把图片变成马赛克效果代码

求VC++把图片变成马赛克效果代码,第1张

这是老师给的高大上的东西:

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=0i<ArrayLengthi++)

{

//初始化每个小块的坐标点

SquareArray[i].pt.x=x

SquareArray[i].pt.y=y

x=x+12

if(x>bitmapWidth)

{x=0y=y+12}

//初始所有小块都未被击中过

SquareArray[i].HitFlag=FALSE

}

long RandNum//随即变量

srand( (unsigned)time( NULL ) )//生成随机种子

for(i=0i<=ArrayLengthi++)

{

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

}

用photoshop打开要打马赛克的照片。

用选款工具选择要打马赛克的部位。

依次点击“滤镜”→“像素化”→“马赛克”

调整单元格的大小,选择自己满意的效果后按“确定”

图片已经成功打上马赛克。

点击“文件”“储存”选择相关选项后按“确定”即可。


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

原文地址: http://outofmemory.cn/bake/11737036.html

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

发表评论

登录后才能评论

评论列表(0条)

保存