国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Android > 正文

Android模糊處理實現(xiàn)圖片毛玻璃效果

2020-04-11 10:47:27
字體:
供稿:網(wǎng)友

本文實例講解了Android 虛化圖片、模糊圖片、圖片毛玻璃效果的實現(xiàn)方法,具體內(nèi)容如下

效果如圖:

在Android可以用RenderScript方便的實現(xiàn)這個方法:

private void blur(Bitmap bkg, View view, float radius) {   Bitmap overlay = Bitmap.createBitmap(view.getMeasuredWidth(), view.getMeasuredHeight(), Bitmap.Config.ARGB_8888);   Canvas canvas = new Canvas(overlay);   canvas.drawBitmap(bkg, -view.getLeft(), -view.getTop(), null);   RenderScript rs = RenderScript.create(this);   Allocation overlayAlloc = Allocation.createFromBitmap(rs, overlay);   ScriptIntrinsicBlur blur = ScriptIntrinsicBlur.create(rs, overlayAlloc.getElement());   blur.setInput(overlayAlloc);   blur.setRadius(radius);   blur.forEach(overlayAlloc);   overlayAlloc.copyTo(overlay);   view.setBackground(new BitmapDrawable(getResources(), overlay));   rs.destroy();  } 

但是RenderScript的這個方法需要Android API17,也就說需要在Android 4.2上才能實現(xiàn)。
低于Android4.2可以用Java原生代碼實現(xiàn)。但是效率會低不少:這完全是一種妥協(xié)的方式,不推薦。

/*   * This method was copied from http://stackoverflow.com/a/10028267/694378.   * The only modifications I've made are to remove a couple of Log   * statements which could slow things down slightly.   */  public Bitmap fastblur(Bitmap sentBitmap, int radius) {    // Stack Blur v1.0 from   // http://www.quasimondo.com/StackBlurForCanvas/StackBlurDemo.html   //   // Java Author: Mario Klingemann <mario at quasimondo.com>   // http://incubator.quasimondo.com   // created Feburary 29, 2004   // Android port : Yahel Bouaziz <yahel at kayenko.com>   // http://www.kayenko.com   // ported april 5th, 2012    // This is a compromise between Gaussian Blur and Box blur   // It creates much better looking blurs than Box Blur, but is   // 7x faster than my Gaussian Blur implementation.   //   // I called it Stack Blur because this describes best how this   // filter works internally: it creates a kind of moving stack   // of colors whilst scanning through the image. Thereby it   // just has to add one new block of color to the right side   // of the stack and remove the leftmost color. The remaining   // colors on the topmost layer of the stack are either added on   // or reduced by one, depending on if they are on the right or   // on the left side of the stack.   //   // If you are using this algorithm in your code please add   // the following line:   //   // Stack Blur Algorithm by Mario Klingemann <mario@quasimondo.com>    Bitmap 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);  } 

以上就是本文的全部內(nèi)容,希望對大家學(xué)習(xí)Android軟件編程有所幫助。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 永春县| 邻水| 尚义县| 连平县| 甘洛县| 乌兰县| 青龙| 集安市| 枣庄市| 皮山县| 哈巴河县| 延川县| 车险| 屏东市| 贵港市| 永定县| 乌什县| 孝义市| 临沂市| 墨脱县| 武城县| 商城县| 靖远县| 莱阳市| 偃师市| 邵武市| 绥宁县| 韶关市| 巴南区| 芒康县| 竹溪县| 巨鹿县| 恭城| 枣庄市| 乌鲁木齐市| 响水县| 旌德县| 陆川县| 泰来县| 南通市| 新闻|