由于项目需要,做一个高斯模糊的效果,实现毛玻璃的效果用于软件的界面上,当然算法的速度不能慢。GDI+1.1提供了这种特效,而且速度超快,处理1680*640的图像200ms左右,而且只有模糊半径R为[10,20]的时候,会出现峰值200ms左右,其余R都在200ms以下,甚至达到几十ms的速度。但是xp上的版本为GDI+1.0,不能直接使用GDI+ 的特效,不得已只能寻找开源实现。之后搜到了这个帖子:http://bbs.csdn.net/topics/380203851。一楼提供了这个网站:http://incubator.quasimondo.com/processing/superfast_blur.php上面的代码是processing2的代码,右下角有cpp的实现,这正不是想要的么。阅读源码发现(http://oppei.tumblr.com/post/47346262/super-fast-blur-v1-1-by-mario-klingemann),需要RGBRGB这样的内存结构的图像,这是24位的微软上Bitmap的内存结构,不过DIB的格式又有点不同,它是BGRBGR..这种顺序,而且在每行的末尾,如果该行像素点所占用的内存不是4B的整数倍,会用0补齐。于是,我将代码修改成如下:
void superFastBlur(unsigned char * pix, int w, int h, int radius) {
if (radius<1) return;
int wm=w-1;
int hm=h-1;
int wh=w*h;
int div=radius+radius+1;
unsigned char * r=new unsigned char[wh];
unsigned char * g=new unsigned char[wh];
unsigned char * b=new unsigned char[wh];
int rsum,gsum,bsum,x,y,i,p,p1,p2,yp,yi,yw;
int *vMIN = new int[max(w,h)];
int *vMAX = new int[max(w,h)];
unsigned char *dv=new unsigned char[256*div];
for (i=0;i<256*div;i++)
dv[i]=(i/div);
yw=yi=0;
for (y=0;y<h;y++){
rsum=gsum=bsum=0;
for(i=-radius;i<=radius;i++){
p = (yi + min(wm,max(i,0))) * 3;
bsum += pix[p];
gsum += pix[p+1];
rsum += pix[p+2];
}
for (x=0;x<w;x++){
r[yi]=dv[rsum];
g[yi]=dv[gsum];
b[yi]=dv[bsum];
if(y==0){
vMIN[x]=min(x+radius+1,wm);
vMAX[x]=max(x-radius,0);
}
p1 = (yw+vMIN[x])*3;
p2 = (yw+vMAX[x])*3;
bsum += pix[p1] - pix[p2];
gsum += pix[p1+1] - pix[p2+1];
rsum += pix[p1+2] - pix[p2+2];
yi++;
}
yw+=w;
}
for (x=0;x<w;x++){
rsum=gsum=bsum=0;
yp=-radius*w;
for(i=-radius;i<=radius;i++){
yi=max(0,yp)+x;
rsum+=r[yi];
gsum+=g[yi];
bsum+=b[yi];
yp+=w;
}
yi=x;
for