Android實(shí)現(xiàn)圖片高斯模糊
本文實(shí)例為大家分享了Android實(shí)現(xiàn)圖片高斯模糊的具體代碼,供大家參考,具體內(nèi)容如下
原圖:
高斯模糊后:
FastBlur.java
import android.graphics.Bitmap; /** ?* Description: ?* User: chenzheng ?* Date: 2017/2/22 0022 ?* Time: 12:22 ?*/ public class FastBlur { ? ? public static Bitmap doBlur(Bitmap sentBitmap, int radius, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? boolean canReuseInBitmap) { ? ? ? ? Bitmap bitmap; ? ? ? ? if (canReuseInBitmap) { ? ? ? ? ? ? bitmap = sentBitmap; ? ? ? ? } else { ? ? ? ? ? ? bitmap = sentBitmap.copy(sentBitmap.getConfig(), true); ? ? ? ? } ? ? ? ? if (radius < 1) { ? ? ? ? ? ? return (null); ? ? ? ? } ? ? ? ? int w = bitmap.getWidth(); ? ? ? ? int h = bitmap.getHeight(); ? ? ? ? int[] pix = new int[w * h]; ? ? ? ? bitmap.getPixels(pix, 0, w, 0, 0, w, h); ? ? ? ? int wm = w - 1; ? ? ? ? int hm = h - 1; ? ? ? ? int wh = w * h; ? ? ? ? int div = radius + radius + 1; ? ? ? ? int r[] = new int[wh]; ? ? ? ? int g[] = new int[wh]; ? ? ? ? int b[] = new int[wh]; ? ? ? ? int rsum, gsum, bsum, x, y, i, p, yp, yi, yw; ? ? ? ? int vmin[] = new int[Math.max(w, h)]; ? ? ? ? int divsum = (div + 1) >> 1; ? ? ? ? divsum *= divsum; ? ? ? ? int dv[] = new int[256 * divsum]; ? ? ? ? for (i = 0; i < 256 * divsum; i++) { ? ? ? ? ? ? dv[i] = (i / divsum); ? ? ? ? } ? ? ? ? yw = yi = 0; ? ? ? ? int[][] stack = new int[div][3]; ? ? ? ? int stackpointer; ? ? ? ? int stackstart; ? ? ? ? int[] sir; ? ? ? ? int rbs; ? ? ? ? int r1 = radius + 1; ? ? ? ? int routsum, goutsum, boutsum; ? ? ? ? int rinsum, ginsum, binsum; ? ? ? ? for (y = 0; y < h; y++) { ? ? ? ? ? ? rinsum = ginsum = binsum = routsum = goutsum = boutsum = rsum = gsum = bsum = 0; ? ? ? ? ? ? for (i = -radius; i <= radius; i++) { ? ? ? ? ? ? ? ? p = pix[yi + Math.min(wm, Math.max(i, 0))]; ? ? ? ? ? ? ? ? sir = stack[i + radius]; ? ? ? ? ? ? ? ? sir[0] = (p & 0xff0000) >> 16; ? ? ? ? ? ? ? ? sir[1] = (p & 0x00ff00) >> 8; ? ? ? ? ? ? ? ? sir[2] = (p & 0x0000ff); ? ? ? ? ? ? ? ? rbs = r1 - Math.abs(i); ? ? ? ? ? ? ? ? rsum += sir[0] * rbs; ? ? ? ? ? ? ? ? gsum += sir[1] * rbs; ? ? ? ? ? ? ? ? bsum += sir[2] * rbs; ? ? ? ? ? ? ? ? if (i > 0) { ? ? ? ? ? ? ? ? ? ? rinsum += sir[0]; ? ? ? ? ? ? ? ? ? ? ginsum += sir[1]; ? ? ? ? ? ? ? ? ? ? binsum += sir[2]; ? ? ? ? ? ? ? ? } else { ? ? ? ? ? ? ? ? ? ? routsum += sir[0]; ? ? ? ? ? ? ? ? ? ? goutsum += sir[1]; ? ? ? ? ? ? ? ? ? ? boutsum += sir[2]; ? ? ? ? ? ? ? ? } ? ? ? ? ? ? } ? ? ? ? ? ? stackpointer = radius; ? ? ? ? ? ? for (x = 0; x < w; x++) { ? ? ? ? ? ? ? ? r[yi] = dv[rsum]; ? ? ? ? ? ? ? ? g[yi] = dv[gsum]; ? ? ? ? ? ? ? ? b[yi] = dv[bsum]; ? ? ? ? ? ? ? ? rsum -= routsum; ? ? ? ? ? ? ? ? gsum -= goutsum; ? ? ? ? ? ? ? ? bsum -= boutsum; ? ? ? ? ? ? ? ? stackstart = stackpointer - radius + div; ? ? ? ? ? ? ? ? sir = stack[stackstart % div]; ? ? ? ? ? ? ? ? routsum -= sir[0]; ? ? ? ? ? ? ? ? goutsum -= sir[1]; ? ? ? ? ? ? ? ? boutsum -= sir[2]; ? ? ? ? ? ? ? ? if (y == 0) { ? ? ? ? ? ? ? ? ? ? vmin[x] = Math.min(x + radius + 1, wm); ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? p = pix[yw + vmin[x]]; ? ? ? ? ? ? ? ? sir[0] = (p & 0xff0000) >> 16; ? ? ? ? ? ? ? ? sir[1] = (p & 0x00ff00) >> 8; ? ? ? ? ? ? ? ? sir[2] = (p & 0x0000ff); ? ? ? ? ? ? ? ? rinsum += sir[0]; ? ? ? ? ? ? ? ? ginsum += sir[1]; ? ? ? ? ? ? ? ? binsum += sir[2]; ? ? ? ? ? ? ? ? rsum += rinsum; ? ? ? ? ? ? ? ? gsum += ginsum; ? ? ? ? ? ? ? ? bsum += binsum; ? ? ? ? ? ? ? ? stackpointer = (stackpointer + 1) % div; ? ? ? ? ? ? ? ? sir = stack[(stackpointer) % div]; ? ? ? ? ? ? ? ? routsum += sir[0]; ? ? ? ? ? ? ? ? goutsum += sir[1]; ? ? ? ? ? ? ? ? boutsum += sir[2]; ? ? ? ? ? ? ? ? rinsum -= sir[0]; ? ? ? ? ? ? ? ? ginsum -= sir[1]; ? ? ? ? ? ? ? ? binsum -= sir[2]; ? ? ? ? ? ? ? ? yi++; ? ? ? ? ? ? } ? ? ? ? ? ? yw += w; ? ? ? ? } ? ? ? ? for (x = 0; x < w; x++) { ? ? ? ? ? ? rinsum = ginsum = binsum = routsum = goutsum = boutsum = rsum = gsum = bsum = 0; ? ? ? ? ? ? yp = -radius * w; ? ? ? ? ? ? for (i = -radius; i <= radius; i++) { ? ? ? ? ? ? ? ? yi = Math.max(0, yp) + x; ? ? ? ? ? ? ? ? sir = stack[i + radius]; ? ? ? ? ? ? ? ? sir[0] = r[yi]; ? ? ? ? ? ? ? ? sir[1] = g[yi]; ? ? ? ? ? ? ? ? sir[2] = b[yi]; ? ? ? ? ? ? ? ? rbs = r1 - Math.abs(i); ? ? ? ? ? ? ? ? rsum += r[yi] * rbs; ? ? ? ? ? ? ? ? gsum += g[yi] * rbs; ? ? ? ? ? ? ? ? bsum += b[yi] * rbs; ? ? ? ? ? ? ? ? if (i > 0) { ? ? ? ? ? ? ? ? ? ? rinsum += sir[0]; ? ? ? ? ? ? ? ? ? ? ginsum += sir[1]; ? ? ? ? ? ? ? ? ? ? binsum += sir[2]; ? ? ? ? ? ? ? ? } else { ? ? ? ? ? ? ? ? ? ? routsum += sir[0]; ? ? ? ? ? ? ? ? ? ? goutsum += sir[1]; ? ? ? ? ? ? ? ? ? ? boutsum += sir[2]; ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? if (i < hm) { ? ? ? ? ? ? ? ? ? ? yp += w; ? ? ? ? ? ? ? ? } ? ? ? ? ? ? } ? ? ? ? ? ? yi = x; ? ? ? ? ? ? stackpointer = radius; ? ? ? ? ? ? for (y = 0; y < h; y++) { ? ? ? ? ? ? ? ? // Preserve alpha channel: ( 0xff000000 & pix[yi] ) ? ? ? ? ? ? ? ? pix[yi] = (0xff000000 & pix[yi]) | (dv[rsum] << 16) ? ? ? ? ? ? ? ? ? ? ? ? | (dv[gsum] << 8) | dv[bsum]; ? ? ? ? ? ? ? ? rsum -= routsum; ? ? ? ? ? ? ? ? gsum -= goutsum; ? ? ? ? ? ? ? ? bsum -= boutsum; ? ? ? ? ? ? ? ? stackstart = stackpointer - radius + div; ? ? ? ? ? ? ? ? sir = stack[stackstart % div]; ? ? ? ? ? ? ? ? routsum -= sir[0]; ? ? ? ? ? ? ? ? goutsum -= sir[1]; ? ? ? ? ? ? ? ? boutsum -= sir[2]; ? ? ? ? ? ? ? ? if (x == 0) { ? ? ? ? ? ? ? ? ? ? vmin[y] = Math.min(y + r1, hm) * w; ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? p = x + vmin[y]; ? ? ? ? ? ? ? ? sir[0] = r[p]; ? ? ? ? ? ? ? ? sir[1] = g[p]; ? ? ? ? ? ? ? ? sir[2] = b[p]; ? ? ? ? ? ? ? ? rinsum += sir[0]; ? ? ? ? ? ? ? ? ginsum += sir[1]; ? ? ? ? ? ? ? ? binsum += sir[2]; ? ? ? ? ? ? ? ? rsum += rinsum; ? ? ? ? ? ? ? ? gsum += ginsum; ? ? ? ? ? ? ? ? bsum += binsum; ? ? ? ? ? ? ? ? stackpointer = (stackpointer + 1) % div; ? ? ? ? ? ? ? ? sir = stack[stackpointer]; ? ? ? ? ? ? ? ? routsum += sir[0]; ? ? ? ? ? ? ? ? goutsum += sir[1]; ? ? ? ? ? ? ? ? boutsum += sir[2]; ? ? ? ? ? ? ? ? rinsum -= sir[0]; ? ? ? ? ? ? ? ? ginsum -= sir[1]; ? ? ? ? ? ? ? ? binsum -= sir[2]; ? ? ? ? ? ? ? ? yi += w; ? ? ? ? ? ? } ? ? ? ? } ? ? ? ? bitmap.setPixels(pix, 0, w, 0, 0, w, h); ? ? ? ? return (bitmap); ? ? } }
調(diào)用方法:
private void applyBlur(String filePath) { ? ? ? ? int radius = 1;//模糊程度 ? ? ? ? int scaleRatio = 5; ? ? ? ? Bitmap originBitmap = BitmapFactory.decodeFile(filePath, getBitmapOption(2)); //將圖片的長(zhǎng)和寬縮小味原來的1/2 ? ? ? ? Bitmap scaledBitmap = Bitmap.createScaledBitmap(originBitmap, ? ? ? ? ? ? ? ? originBitmap.getWidth() / scaleRatio, ? ? ? ? ? ? ? ? originBitmap.getHeight() / scaleRatio, ? ? ? ? ? ? ? ? false); ? ? ? ? Bitmap blurBitmap = FastBlur.doBlur(scaledBitmap, radius, true); ? ? ? ? navLayout.setBackgroundDrawable(new BitmapDrawable(blurBitmap)); ? ? }
private BitmapFactory.Options getBitmapOption(int inSampleSize){ ? ? ? ? System.gc(); ? ? ? ? BitmapFactory.Options options = new BitmapFactory.Options(); ? ? ? ? options.inPurgeable = true; ? ? ? ? options.inSampleSize = inSampleSize; ? ? ? ? return options; ?}
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
在Android環(huán)境下WebView中攔截所有請(qǐng)求并替換URL示例詳解
這篇文章主要介紹了在Android環(huán)境下WebView中攔截所有請(qǐng)求并替換URL示例詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07關(guān)于AndroidStudio R文件莫名其妙缺失的快速解決方法
下面小編就為大家?guī)硪黄P(guān)于AndroidStudio R文件莫名其妙缺失的快速解決方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-03-03android網(wǎng)絡(luò)圖片查看器簡(jiǎn)單實(shí)現(xiàn)代碼
這篇文章主要為大家詳細(xì)介紹了android網(wǎng)絡(luò)圖片查看器的簡(jiǎn)單實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03Android中使用socket通信實(shí)現(xiàn)消息推送的方法詳解
這篇文章主要介紹了Android中使用socket通信實(shí)現(xiàn)消息推送的方法,文中舉了一個(gè)消息發(fā)送端和一個(gè)消息接收端以及服務(wù)器端的例子來說明原理并且展示了客戶端的實(shí)現(xiàn),需要的朋友可以參考下2016-04-04Android中ListActivity用法實(shí)例分析
這篇文章主要介紹了Android中ListActivity用法,結(jié)合實(shí)例形式較為詳細(xì)的分析了ListActivity功能,注意事項(xiàng)與相關(guān)使用技巧,需要的朋友可以參考下2016-02-02Android RecyclerView自由拖動(dòng)item的實(shí)現(xiàn)代碼
這篇文章主要介紹了Android RecyclerView自由拖動(dòng)item的實(shí)現(xiàn)代碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2024-01-01Android與單片機(jī)通信常用數(shù)據(jù)轉(zhuǎn)換方法總結(jié)
本文主要介紹Android與單片機(jī)通信常用數(shù)據(jù)轉(zhuǎn)換方法,這里提供了代碼示例,有需要的小伙伴可以參考下2016-09-09