生活随笔
收集整理的這篇文章主要介紹了
图像处理之玻璃水印特效(祝大家圣诞节快乐)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
from:http://blog.csdn.net/jia20003/article/details/13159535
Water Ripple Effect - 水波紋效果
一:原理
模擬水波紋效果,最常見的是sine或者cosn的函數,周期性變化,貼近自然
當水波紋中中間開始向四周擴散的時候,一般都是慢慢的失去能量,振幅也是
越來越小,所以程序要模擬這個過程時候,要加上一個能量遞減因子。然后用
公式 y = a*sine(bx + c)來表示波紋公式。
二:程序實現
最重要的一步是計算水波紋的振幅。在任意一點確定水波的中心位置,可以是
鼠標隨機選取,對半徑范圍內的像素位置實現水波生成,然后轉換為位置,對
位置實現浮點數取整,然后使用適當的插值算法,本例使用雙線性插值。
三:程序效果
四:濾鏡完全源代碼,這次我寫了些中文注解,不給源代碼的博文不是好博文
[java] view plaincopy
package?com.gloomyfish.filter.study;????import?java.awt.image.BufferedImage;????public?class?WaterFilter?extends?AbstractBufferedImageOp?{??????private?float?wavelength?=?16;??????private?float?amplitude?=?10;??????private?float?phase?=?0;??????private?float?centreX?=?0.5f;??????private?float?centreY?=?0.5f;??????private?float?radius?=?50;????????private?float?radius2?=?0;??????private?float?icentreX;??????private?float?icentreY;????????????public?WaterFilter()?{????????}????????@Override??????public?BufferedImage?filter(BufferedImage?src,?BufferedImage?dest)?{??????????int?width?=?src.getWidth();??????????int?height?=?src.getHeight();????????????if?(?dest?==?null?)??????????????dest?=?createCompatibleDestImage(?src,?null?);????????????int[]?inPixels?=?new?int[width*height];??????????int[]?outPixels?=?new?int[width*height];??????????getRGB(?src,?0,?0,?width,?height,?inPixels?);??????????icentreX?=?width?*?centreX;??????????icentreY?=?height?*?centreY;??????????if?(?radius?==?0?)??????????????radius?=?Math.min(icentreX,?icentreY);??????????radius2?=?radius*radius;??????????int?index?=?0;??????????float[]?out?=?new?float[2];??????????for(int?row=0;?row<height;?row++)?{??????????????for(int?col=0;?col<width;?col++)?{??????????????????index?=?row?*?width?+?col;??????????????????????????????????????????????????????generateWaterRipples(col,?row,?out);??????????????????int?srcX?=?(int)Math.floor(?out[0]?);??????????????????int?srcY?=?(int)Math.floor(?out[1]?);??????????????????float?xWeight?=?out[0]-srcX;??????????????????float?yWeight?=?out[1]-srcY;??????????????????int?nw,?ne,?sw,?se;??????????????????????????????????????????????????????if?(?srcX?>=?0?&&?srcX?<?width-1?&&?srcY?>=?0?&&?srcY?<?height-1)?{????????????????????????????????????????????int?i?=?width*srcY?+?srcX;??????????????????????nw?=?inPixels[i];??????????????????????ne?=?inPixels[i+1];??????????????????????sw?=?inPixels[i+width];??????????????????????se?=?inPixels[i+width+1];??????????????????}?else?{????????????????????????????????????????????nw?=?getPixel(?inPixels,?srcX,?srcY,?width,?height?);??????????????????????ne?=?getPixel(?inPixels,?srcX+1,?srcY,?width,?height?);??????????????????????sw?=?getPixel(?inPixels,?srcX,?srcY+1,?width,?height?);??????????????????????se?=?getPixel(?inPixels,?srcX+1,?srcY+1,?width,?height?);??????????????????}???????????????????????????????????????????????????????????????????????????????outPixels[index]?=?ImageMath.bilinearInterpolate(xWeight,?yWeight,?nw,?ne,?sw,?se);??????????????}??????????}????????????setRGB(?dest,?0,?0,?width,?height,?outPixels?);??????????return?dest;??????}????????private?int?getPixel(int[]?pixels,?int?x,?int?y,?int?width,?int?height)?{??????????if?(x?<?0?||?x?>=?width?||?y?<?0?||?y?>=?height)?{??????????????return?0;???????????}??????????return?pixels[?y*width+x?];??????}????????protected?void?generateWaterRipples(int?x,?int?y,?float[]?out)?{??????????float?dx?=?x-icentreX;??????????float?dy?=?y-icentreY;??????????float?distance2?=?dx*dx?+?dy*dy;????????????????????if?(distance2?>?radius2)?{???????????????out[0]?=?x;??????????????out[1]?=?y;??????????}?else?{????????????????????????????float?distance?=?(float)Math.sqrt(distance2);????????????????????????????float?amount?=?amplitude?*?(float)Math.sin(distance?/?wavelength?*?ImageMath.TWO_PI?-?phase);????????????????????????????amount?*=?(radius-distance)/radius;???????????????if?(?distance?!=?0?)??????????????????amount?*=?wavelength/distance;????????????????????????????out[0]?=?x?+?dx*amount;??????????????out[1]?=?y?+?dy*amount;??????????}??????}????????}??
覺得不錯請頂一下,謝謝!
轉載請務必注明出處!謝謝!
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀
總結
以上是生活随笔為你收集整理的图像处理之玻璃水印特效(祝大家圣诞节快乐)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。