android api实现高斯模糊,且兼容低版本

一、利用android api实现高斯模糊

关于高斯模糊网上已经有很多不错的文章介绍了,在这里就不重复了。先来看一个效果

效果已经看到了,就来看看怎么实现的吧。首先是实现高斯模糊的核心代码

<span style="white-space:pre">	</span>public static Bitmap blurBitmap(Bitmap bitmap, Context context) {

		// 用需要创建高斯模糊bitmap创建一个空的bitmap
		Bitmap outBitmap = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Config.ARGB_8888);

		// 初始化Renderscript,这个类提供了RenderScript context,在创建其他RS类之前必须要先创建这个类,他控制RenderScript的初始化,资源管理,释放
		RenderScript rs = RenderScript.create(context);

		// 创建高斯模糊对象
		ScriptIntrinsicBlur blurScript = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs));

		// 创建Allocations,此类是将数据传递给RenderScript内核的主要方法,并制定一个后备类型存储给定类型
		Allocation allIn = Allocation.createFromBitmap(rs, bitmap);
		Allocation allOut = Allocation.createFromBitmap(rs, outBitmap);

		// 设定模糊度
		blurScript.setRadius(25.f);

		// Perform the Renderscript
		blurScript.setInput(allIn);
		blurScript.forEach(allOut);

		// Copy the final bitmap created by the out Allocation to the outBitmap
		allOut.copyTo(outBitmap);

		// recycle the original bitmap
		bitmap.recycle();

		// After finishing everything, we destroy the Renderscript.
		rs.destroy();

		return outBitmap;
	}

然后是调用部分

<span style="white-space:pre">	</span>public static Bitmap getBlurBitmap(View rootView, Context context) {
		try {
			if (rootView == null || context == null) {
				return null;
			}
			rootView.setDrawingCacheEnabled(true);
			Bitmap drawingCache = rootView.getDrawingCache();
			Bitmap bgBitmap = Bitmap.createBitmap(drawingCache);
			return BitmapUtil.blurBitmap(bgBitmap, context);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

这样就可以就实现了高斯模糊效果,再将模糊效果显示在界面上就可以了。

二、兼容低版本

android有一个很麻烦的东西就是需要兼容的版本很多,按照上面的方式实现了,在4.2及以上的版本就可以轻松出效果了,但是在低版本就会出异常:java.lang.NoClassDefFoundError: android.renderscript.ScriptIntrinsicBlur。导致这个问题就是因为这个api不能向下兼容,现在我们就来解决这个问题。其实google早就提供了方案,我们只需要使用就好了。

1、引入renderscript-v8.jar(将jar包放在libs目录下,add to build path,一般只需要引入就可以)

如果只加入了jar包,工程不会报错,但是运行就会有问题:android.support.v8.renderscript.RSRuntimeException: Error loading RS jni library:java.lang.UnsatisfiedLinkError:
Couldn‘t load RSSupport: findLibrary returned null;从错误中可以看出就是没有找到jni library

2、在libs目录下分别建三个目录:armeabi-v7a、mips、x86,然后将librsjni.so和libRSSupport.so分别放到对应的目录下就可以了

:这些资源都是在sdk中包含,我的是在:sdk\build-tools\android-4.4.2\renderscript,你们可以找找你们自己的目录

到这里就可以完美的兼容4.2以下的版本了。

三、说明

1、因为公司一直还在用eclipse,所以这套解决方案也是在eclipse上面的,android studio应该比这个还简单,具体可以参考:点击打开链接

2、网上也有很多种方式来实现高斯模糊,我个人也尝试了些,但是效果都没有ScriptIntrinsicBlur,因为google的RenderScript具有很高效的图形能力,有关RenderScript想深入了解的同学请自行google

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-06 08:57:50

android api实现高斯模糊,且兼容低版本的相关文章

[转]AppCompat 22.1,Goole暴走,MD全面兼容低版本

AppCompat 22.1,Goole暴走,MD全面兼容低版本 分类: Android2015-04-24 09:48 1354人阅读 评论(0) 收藏 举报 android 目录(?)[+] 武侠相关的文学作品中常用“四十岁后不滞于物,草木竹石均可为剑.自此精进,渐入无剑胜有剑之境.”形容一个人的武功技艺高超,已臻化境.而我们IT工程师自身的技艺水平到达一定程度后,也会处于这种“无码胜有码”的境界.但这是什么意思呢?是说我们从此不再写代码,每天躺在床上和白花花的天花板无言对望了吗? 不是的.

GridView.setChoiceMode(GridView.CHOICE_MODE_MULTIPLE_MODAL)不兼容低版本系统解决方案

项目开发中需要使用GridView批处理操作,多项选择. 但是GridView.setChoiceMode(GridView.CHOICE_MODE_MULTIPLE_MODAL)不兼容低版本. 找解决方案,查看android sdk提供的demo里介绍的GridView多项选择的方法 public class Grid3 extends Activity { GridView mGrid; @Override protected void onCreate(Bundle savedInstan

兼容低版本的array_column

//兼容低版本的array_column public function array_column($input, $columnKey, $indexKey = NULL) { $columnKeyIsNumber = (is_numeric($columnKey)) ? TRUE : FALSE; $indexKeyIsNull = (is_null($indexKey)) ? TRUE : FALSE; $indexKeyIsNumber = (is_numeric($indexKey))

模拟实现兼容低版本IE浏览器的原生bind()函数功能

模拟实现兼容低版本IE浏览器的原生bind()函数功能: 代码如下: if(!Function.prototype.bind){   Function.prototype.bind=function(oThis){     if (typeof this !== 'function'){       throw new TypeError('调用者不是当前函数对象');     }       var aArgs = Array.prototype.slice.call(arguments, 1

兼容低版本IE浏览器的边框阴影效果

兼容低版本IE浏览器的边框阴影效果:使用box-show属性可以实现边框阴影效果,但是IE8和IE8以下浏览器不支持此属性,不过可以通过以下方式实现,当然实现全兼容的方式有多种,下面是一种比较简陋的方式,代码实例如下: <!DOCTYPE html> <html> <head> <meta charset=" utf-8"> <meta name="author" content="http://www

兼容低版本IE和非IE浏览器的事件绑定函数

我们知道为元素绑定事件可以使用addEventListener方法,但是低版本IE下是没有这个方法,这时我们就要使用attachEvent方法去兼容,可以写成下面这样: 1 /* 2 兼容低版本IE,ele为需要绑定事件的元素, 3 eventName为事件名(保持addEventListener语法,去掉on),fun为事件响应函数 4 */ 5 6 function addEvent(ele,eventName,fun){ 7 if(ele.addEventListener){ 8 ele.

兼容低版本浏览器的getElementByClassName方法

/*兼容低版本浏览器的getElementByClassName方法*/ function getElementsByClassName(root,className){ if(root.getElementsByClassName){ return root.getElementsByClassName(className); }else{ var elements=root.getElementsByTagName(); var result=[]; for(var i=0,element;

a标签内容在div中垂直居中,不兼容低版本浏览器

<!doctype html><html lang="en"><head> <meta charset="UTF-8"> <title></title></head> <style>.box{width:100px;height:200px;background:orange;border:2px solid #ccc;display: table;}.box a{dis

Android好奇宝宝_07_ViewPager切换动画(兼容低版本)

闲着无聊,写写Demo 想着写一个图片轮播,百度了一下基本都是用ViewPager实现的,那就用ViewPager来练手. 写完了再自定义切换效果,发现3.0以下不兼容,只好想办法. 先上效果图: 下面一步一步来: (1)写布局: <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" > <jjj.demo.viewpager