图像特效之毛玻璃(扩散)
关键代码:
#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;
}
效果: