图像特效之毛玻璃(扩散)

图像特效之毛玻璃(扩散)

关键代码:

#define MAXINTENSITY   255
typedef struct rgbpix
{
	T_U8 R;
	T_U8 G;
	T_U8 B;
}RGBPIX;

T_U8 Calc_intensity(RGBPIX p)
{
	return (T_U8)(0.3*p.R+0.59*p.G+0.11*p.B);
}
RGBPIX RandomColor(T_U8* img,DWORD width,DWORD height,int col,int row,T_U32 line_byte,int r)
{
	RGBPIX p;
	int i,j,numint,pix_index;
	T_U8 intensity;
	int randnum, pixcount, indx;
	

	T_U8 intensitycount[MAXINTENSITY+1] = {0};
	T_U32 averageR[MAXINTENSITY+1] = {0};
	T_U32 averageG[MAXINTENSITY+1] = {0};
	T_U32 averageB[MAXINTENSITY+1] = {0};

	for(i = 0;i < MAXINTENSITY+1;i++)
		intensitycount[i] = 0;

	numint = 0;
	for(i = col -r;i <= col+r;i++)
	{
		for(j = row-r;j <= row+r;j++)
		{

			if(i >= 0 && i < height && j >=0 && j <width)
			{
				pix_index = i*line_byte+3*j;
				p.R = img[pix_index+2];
				p.G = img[pix_index+1];
				p.B = img[pix_index+0];
				intensity = Calc_intensity(p);
				intensitycount[intensity]++;
				numint++;

				if(intensitycount[intensity] == 1)
				{
					averageR[intensity] = p.R;
					averageG[intensity] = p.G;
					averageB[intensity] = p.B;
				}
				else
				{
					averageR[intensity] += p.R;
					averageG[intensity] += p.G;
					averageB[intensity] += p.B;

				}
			}

		}
	}

	do
	{
		randnum = (int)((rand()+1) * ((double)numint / (RAND_MAX+1)));// the range is 0-numint
		pixcount = 0;
		indx = 0;
		do
		{
			pixcount += intensitycount[indx]; 
			indx++;
		} while (pixcount < randnum);
		
		intensity = indx-1;
	}while(intensitycount[intensity] == 0);

	p.R = averageR[intensity]/intensitycount[intensity];
	p.G = averageG[intensity]/intensitycount[intensity];
	p.B = averageB[intensity]/intensitycount[intensity];

	return p;

}
int FrostGlass(IMAGE_TYPE *BMP24_img,int r)
{
	DWORD width,height,i,j,bfsize;
	WORD  biBitCount;
	T_U8 *dst,*bmp,*img_data;
	T_U32 line_byte,Imgindex;
	RGBPIX p;
	
	BITMAPFILEHEADER bf;
	BITMAPINFOHEADER bi;
	
	FILE *FrostGlass_fp = fopen("FrostGlass.bmp","wb");
	
	if(NULL == FrostGlass_fp)
	{
		printf("Can't open FrostGlass.bmp\n");
		return -1;
	}
	
	memset(&bf, 0, sizeof(bf));
	memset(&bi, 0, sizeof(bi));
	
	bmp = BMP24_img;
	memcpy(&bf,bmp,14);
	memcpy(&bi,&bmp[14],40);

	fwrite(&bf,sizeof(BITMAPFILEHEADER),1,FrostGlass_fp);
	fwrite(&bi,sizeof(BITMAPINFOHEADER),1,FrostGlass_fp);
	
	height = bi.biHeight;
	width  = bi.biWidth;
	bfsize = bf.bfSize;
	biBitCount = bi.biBitCount;
	line_byte = WIDTHBYTES(width*bi.biBitCount);
	img_data = bmp+54;
	
	dst = (T_U8 *)malloc(line_byte*height);
	memset(dst,0,line_byte*height);
	memcpy(dst,img_data,line_byte*height);

	for(i = 0;i < height;i++)
	{
		for(j = 0;j < width;j++)
		{
			Imgindex = i*line_byte+3*j;
			p = RandomColor(img_data,width,height,i,j,line_byte,r);

			dst[Imgindex+0] = p.B;
			dst[Imgindex+1] = p.G;
			dst[Imgindex+2] = p.R;
		}
	}

	fwrite(dst,line_byte*height,1,FrostGlass_fp);
	fclose(FrostGlass_fp);
	FrostGlass_fp = NULL;
	free(dst);
	return 0;
}

效果:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值