Blur

自从iOS系统引入了Blur效果,也就是所谓的毛玻璃、模糊化效果,磨砂效果,各大系统就开始竞相模仿,这是一个怎样的效果呢,我们现来看一些图:

这些就是典型的Blur效果,在iOS和MIUI中还有很多,这里就不再贴图了。

有兴趣的朋友可以去看看。

使用

下面我们来看看如何在Android中来使用Blur,当然,我们需要使用上面提到的FastBlur

packagecom.xys.blur;importandroid.graphics.Bitmap;/*** Created by paveld on 3/6/14.*/
public class FastBlur {publicstatic Bitmap doBlur(Bitmap sentBitmap, intradius, booleancanReuseInBitmap) {// 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;if(canReuseInBitmap) {bitmap = sentBitmap;}else{bitmap = sentBitmap.copy(sentBitmap.getConfig(), true);}if(radius < 1) {return(null);}intw = bitmap.getWidth();inth = bitmap.getHeight();int[] pix = newint[w * h];bitmap.getPixels(pix,0, w, 0,0, w, h);intwm = w - 1;inthm = h - 1;intwh = w * h;intdiv = radius + radius + 1;intr[] = newint[wh];intg[] = newint[wh];intb[] = newint[wh];intrsum, gsum, bsum, x, y, i, p, yp, yi, yw;intvmin[] = newint[Math.max(w, h)];intdivsum = (div + 1) >> 1;divsum *= divsum;intdv[] = newint[256* divsum];for(i = 0; i < 256* divsum; i++) {dv[i] = (i / divsum);}yw = yi = 0;int[][] stack = newint[div][3];intstackpointer;intstackstart;int[] sir;intrbs;intr1 = radius + 1;introutsum, goutsum, boutsum;intrinsum, 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);}
}

算法就是这样了,不要问我懂不懂,你懂的。

使用

如何在程序中使用呢,也很简单:

package com.xys.blur;import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.drawable.BitmapDrawable;
import android.os.Bundle;
import android.view.View;
import android.view.ViewTreeObserver.OnPreDrawListener;
import android.widget.ImageView;public class Test extends Activity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);final ImageView imageView = (ImageView) findViewById(R.id.image1);final Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.blur);imageView.getViewTreeObserver().addOnPreDrawListener(new OnPreDrawListener() {@Overridepublic boolean onPreDraw() {blur(bitmap, imageView);return true;}});}private void blur(Bitmap bkg, View view) {long startMs = System.currentTimeMillis();float scaleFactor = 8;float radius = 2;Bitmap overlay = Bitmap.createBitmap((int) (view.getMeasuredWidth() / scaleFactor),(int) (view.getMeasuredHeight() / scaleFactor),Bitmap.Config.ARGB_8888);Canvas canvas = new Canvas(overlay);canvas.translate(-view.getLeft() / scaleFactor, -view.getTop()/ scaleFactor);canvas.scale(1 / scaleFactor, 1 / scaleFactor);Paint paint = new Paint();paint.setFlags(Paint.FILTER_BITMAP_FLAG);canvas.drawBitmap(bkg, 0, 0, paint);overlay = FastBlur.doBlur(overlay, (int) radius, true);view.setBackground(new BitmapDrawable(getResources(), overlay));System.out.println(System.currentTimeMillis() - startMs + "ms");}
}

为什么我们要在addOnPreDrawListener中来调用blur方法呢,看我前面的文章的朋友应该会知道,这样做是为了能够在onCreate中获取控件尺寸,通过scaleFactor和radius两个参数,我们来控制Blur的程度。

代码中还有几点需要解释下:

1、我们为什么要通过scaleFactor来缩小图片:由于在做Blur的时候,图片精度本来就要降低,那么我们为什么不先降低精度再去处理呢,这样的效果就是巨大的缩小了生成时间

2、我们给Paint提供了FILTER_BITMAP_FLAG标示,这样的话在处理bitmap缩放的时候,就可以达到双缓冲的效果,模糊处理的过程就更加顺畅了

3、如果我们要做某一部分的Blur效果,一般是将这部分图片裁减下来,然后Blur后设给某个控件的背景

最终效果如下:

效果已经出来了,Demo很简单,只是为了演示使用方法。

以上。

Android 图片虚化,虚化图片,模糊图片相关推荐

  1. python 图片数据清洗,图片去重,去掉模糊图片,去掉结构性相似的图片

    1.python代码去掉完全相同的图片,  重复的图片移动到另一文件夹保存 import shutil import numpy as np from PIL import Image import ...

  2. 图片择优算法(模糊图片筛选出最清楚的图片) 没有使用第三方库

    FuzzyDetection 图片择优(选择最清楚的图片) 实现思路 参考链接 获取图片的灰度图数组 使用拉普拉斯算子进行卷积运算 {0, 1, 0, 1, -4, 1, 0, 1, 0} 获取结果的 ...

  3. html如何让图片边缘模糊化,如何淡化图片周围区域?照片四周虚化怎么弄|最好的照片处理软件...

    十二月的第一天,今天早早醒来天气也是有种突然变冷的感觉,也许广东在为入冬做准备了呀!不管天气怎么变化,小编还是会准时给大家分享音视频图片编辑操作滴!那么本次就给大家分享一个图片处理操作,更多音视频图片 ...

  4. 怎么给图片背景虚化?试试这几种图片背景虚化方法

    将图片背景虚化处理可以使图片的主体更加突出,增强视觉效果,让人更加专注于主体内容.同时,背景虚化也可以起到模糊不必要细节的作用,使照片更加简洁明了.在摄影中,背景虚化也是一种常用的技巧,可以使画面更加 ...

  5. css 背景图片的虚化

    css 背景图片的虚化 背景虚化时出现页面内容也被虚化的情况,使用伪类::before body .bg {position: relative;width: 100%;height: 100%;ov ...

  6. 图片背景虚化怎么做?教你几种好用的制作方法

    图片背景虚化是一种常用的美学手法,可以起到一种美化效果,能够让图片看起来更加柔和和自然,增加艺术感和观赏性.当使用背景虚化时,可以通过调整模糊度和深度来控制效果的程度,从而达到最佳的效果.很多小伙伴不 ...

  7. android如何模糊图片处理图片,Android图片模糊效果

    在进行模糊的时候,可以先对原始图片进行压缩,然后选择一个合适的方式进行模糊. 效果如下: 模糊 1.处理图片 缩放.旋转图片 private Bitmap getBitmap(Bitmap sourc ...

  8. Google 超分辨率技术 RAISR:模糊图片瞬间变清晰,运算速度快十倍

    Google 超分辨率技术 RAISR:模糊图片瞬间变清晰,运算速度快十倍 Everyday the web is used to share and store millions of pictur ...

  9. Android开发常用开源框架:图片处理

    1. 图片加载,缓存,处理 框架名称 功能描述 Android Universal Image Loader 一个强大的加载,缓存,展示图片的库,已过时 Picasso 一个强大的图片下载与缓存的库 ...

  10. android后台通过View生成分享图片

    原文地址:http://www.jianshu.com/p/33e30da0385c 最近工作特忙,好久没静下心总结一些开发中的心得,后面会陆续写一些文章总结一下最近遇到的问题和一些收获吧- 闲话少说 ...

最新文章

  1. java邮件教程_Java发送Email/邮件
  2. redis api-String
  3. jquery-循环遍历
  4. 0x80070659系统策略禁止这个安装_教你如何将电脑C盘设置成禁止安装任何软件
  5. 管理后台--4,删除分类
  6. Hadoop源码篇--Reduce篇
  7. 软件产品三步曲(内容、可用性、视觉)
  8. 测试页能打印 软件不能打,打印机可以打印测试页不能打印文档怎么处理
  9. 搭建内网文件共享服务器,如何搭建共享服务器实现办公室文件共享?
  10. 杭电多校第八场05_Separated Number(组合数前缀和性质)
  11. 什么是软件体系结构?
  12. 在利用计算机高级语言进行,2016计算机一级考试多选题专项训练及答案
  13. 注册微信小程序的操作步骤
  14. 筋斗云教程(一): 运行筋斗云应用
  15. 襄州区张家集镇社工站参与重点人群“敲门行动”
  16. vb wps 链接单元格_使用VB快速制作WPS的COM加载项
  17. Android Activity向右滑动返回
  18. 未来教育的趋势:线上网校和线下教育相结合
  19. 【5G科普】只要9张图,看懂什么是5G
  20. 常见的开发模式和不常见的开发模式

热门文章

  1. python爬虫爬取中央气象台每日天气图
  2. 如何用cocos2d-x来开发简单的Uphone游戏:(四) 音乐音效 最后的润色
  3. 分布式 | BenchmarkSQL 压测 dble 性能调优指南
  4. 海康威视算法实习面试——我的第一次面试经历
  5. vscode 程序员鼓励师_把软萌程序猿鼓励师装进VScode?最强交互彩虹屁,GitHub2.5k星标...
  6. Office/Wps日常操作小技巧
  7. 斯坦福AI百年报告2017:人工智能与机器学习全景式概览
  8. Spring Boot + ECharts
  9. 子母钟时钟系统工业应用
  10. 免费可商用图片网站整理