EGE毛玻璃效果

测试一下项目上传系统。

效果如下(受图片大小限制被迫糊成一团):

QQ截图20200228233143.jpg

该项目仅供参考,正确写法是使用getbuff而不是一堆putpixel和getpixel。

#include <graphics.h>

PIMAGE glass(PIMAGE t){
	//创建增量数组 
	int ax[]={-1,0,1,-1,1,-1,0,1};
	int ay[]={-1,-1,-1,0,0,1,1,1};
	
	PIMAGE f=newimage(getwidth(t),getheight(t));//创建储存边缘的对象 
	PIMAGE ft=newimage(getwidth(t)-2,getheight(t)-2);//创建储存中部图像的对象 
	
	color_t c;
	int r;
	int xt,yt;
	
	f=t;//此处我们不取出边缘所有的点,而是直接克隆 
	//随机取点 
	for(int y=1;y<getheight(t)-1;y++){
		for(int x=1;x<getwidth(t)-1;x++){
			r=random(8);
			xt=x+ax[r];	
			yt=y+ay[r];	
			
			c=getpixel(xt,yt,t);
			putpixel(x-1,y-1,c,ft);
		}
	}
	putimage(f,2,2,ft);//将处理好的中部图像直接盖在f上,f的中部被ft覆盖,故f中只剩下未处理的边缘和处理好的中部 
	delimage(ft);
	return f;
}

int main(){
	initgraph(500,500,0);
	PIMAGE t=newimage();
	PIMAGE f=newimage();
	
	getimage(t,"Image.png");
	initgraph(getwidth(t),getheight(t));
	setcaption("毛玻璃滤镜效果");
	getimage(f,t,getwidth(t)/2,0,getwidth(t),getheight(t));
	imagefilter_blurring(f,0xFF,0x100,0,0,0,0);//处理前先将图片模糊 
	for(int i=0;i<3;i++)
		f=glass(f); 
	
	putimage(t,getwidth(t)/2,0,f);
	putimage(0,0,t);
	saveimage(t,"hfile.jpg");
	getch();
}