写在前面

现在,越来越多的App里面使用了模糊效果,这种模糊效果称之为高斯模糊。大家都知道,在Android平台上进行模糊渲染是一个相当耗CPU也相当耗时的操作,一旦处理不好,卡顿是在所难免的。一般来说,考虑到效率,渲染一张图片最好的方法是使用OpenGL,其次是使用C++/C,使用Java代码是效率是最低,速度也是最慢的。但是Android推出RenderScript之后,我们就有了选择,测试表明,使用RederScript的渲染效率和使用C++/C不相上下,但是使用RenderScript却比使用JNI简单得多!同时,Android团队提供了RenderScript的支持库,使得在低版本的Android平台上也能使用。
不过在使用RenderScript之前,对于模糊一张图片,需要注意的是,我们应该尽量不要使用原尺寸分辨率的图片,最好将图片缩小比例,这小渲染的效率要高一些,速度也更快一些。
什么是RenderScript
RenderScript是一种低级的高性能编程语言,用于3D渲染和处理密集型计算(3D播放等和关于CPU密集型的计算)。一直以来Android 在绘图性能的表现一直差强人意,引入NDK之后才有所改善,而在Honeycomb 中发布了RenderScript 这一杀手级在Framework 后,大大的增加了Android本地语言的执行能力和计算能力。现在网上介绍RenderScript的文章非常少,附上一篇博客,大家可以能更好理解这门语言。
如果需要详细了解,可以查看官方文档RenderScript
动态模糊的实现
使用之前,先要在Module build.gradle里面作下面的定义:
MainActivity.java
package com.jackie.blurimage;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.ImageView;
import android.widget.SeekBar;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
private ImageView mBlurImage, mOriginImage;
private SeekBar mSeekBar;
private TextView mSeekProgress;
private int mAlpha;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
initData();
initEvent();
}
private void initView() {
mBlurImage = (ImageView) findViewById(R.id.blur_image);
mOriginImage = (ImageView) findViewById(R.id.origin_image);
mSeekBar = (SeekBar) findViewById(R.id.seek_bar);
mSeekProgress = (TextView) findViewById(R.id.seek_progress);
}
private void initData() {
// 获取图片
Bitmap originBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.blur);
Bitmap blurBitmap = BlurUtils.blur(this, originBitmap);
// 填充模糊后的图像和原图
mBlurImage.setImageBitmap(blurBitmap);
mOriginImage.setImageBitmap(originBitmap);
}
private void initEvent() {
mSeekBar.setMax(100);
mSeekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
mAlpha = progress;
mOriginImage.setAlpha((int) (255 - mAlpha * 2.55));
mSeekProgress.setText(String.valueOf(mAlpha));
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
}
});
}
}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<FrameLayout
android:layout_width="match_parent"
android:layout_weight="1"
android:layout_height="0dp">
<ImageView
android:id="@+id/blur_image"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="centerCrop"
android:src="@drawable/blur"/>
<ImageView
android:id="@+id/origin_image"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scaleType="centerCrop"/>
</FrameLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="80dp"
android:orientation="vertical">
<SeekBar
android:id="@+id/seek_bar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:layout_marginTop="@dimen/activity_vertical_margin"/>
<TextView
android:id="@+id/seek_progress"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="0"
android:textSize="24sp"/>
</LinearLayout>
</LinearLayout>
从上面的代码可以看出,在FrameLayout上放了两张图片,然后动态更改图片的透明度来达到动态模糊效果。
BlurUtils.java
package com.jackie.blurimage;
import android.content.Context;
import android.graphics.Bitmap;
import android.renderscript.Allocation;
import android.renderscript.Element;
import android.renderscript.RenderScript;
import android.renderscript.ScriptIntrinsicBlur;
/**
* Created by Jackie on 2017/1/21.
* 高斯模糊工具类
*/
public class BlurUtils {
/**
* 图片缩放比例
*/
private static final float SCALE_DEGREE = 0.4f;
/**
* 最大模糊度(在0.0到25.0之间)
*/
private static final float BLUR_RADIUS = 25f;
/**
* 模糊图片
* @param context 上下文
* @param bitmap 需要模糊的图片
* @return 模糊处理后的图片
*/
public static Bitmap blur(Context context,Bitmap bitmap) {
//计算图片缩小的长宽
int width = Math.round(bitmap.getWidth() * SCALE_DEGREE);
int height = Math.round(bitmap.getHeight() * SCALE_DEGREE);
//将缩小后的图片作为预渲染的图片
Bitmap inputBitmap = Bitmap.createScaledBitmap(bitmap, width, height, false);
//创建一张渲染后的输入图片
Bitmap outputBitmap = Bitmap.createBitmap(inputBitmap);
//创建RenderScript内核对象
RenderScript renderScript = RenderScript.create(context);
//创建一个模糊效果的RenderScript的工具对象
ScriptIntrinsicBlur scriptIntrinsicBlur = ScriptIntrinsicBlur.create(renderScript, Element.U8_4(renderScript));
/**
* 由于RenderScript并没有使用VM来分配内存,所以需要使用Allocation类来创建和分配内存空间。
* 创建Allocation对象的时候其实内存是空的,需要使用copyTo()将数据填充进去。
*/
Allocation inputAllocation = Allocation.createFromBitmap(renderScript, inputBitmap);
Allocation outputAllocation = Allocation.createFromBitmap(renderScript, outputBitmap);
//设置渲染的模糊程度,25f是最大模糊度
scriptIntrinsicBlur.setRadius(BLUR_RADIUS);
//设置ScriptIntrinsicBlur对象的输入内存
scriptIntrinsicBlur.setInput(inputAllocation);
//将ScriptIntrinsicBlur输出数据保存到输出内存中
scriptIntrinsicBlur.forEach(outputAllocation);
//将数据填充到Allocation中
outputAllocation.copyTo(outputBitmap);
return outputBitmap;
}
}
效果图如下,妹纸一枚!
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# android
# 动态模糊
# 动态高斯模糊
# 高斯模糊
# Android关于Glide的使用(高斯模糊、加载监听、圆角图片)
# Android实现图片的高斯模糊(两种方式)
# Android图片特效:黑白特效、圆角效果、高斯模糊
# Android实现动态高斯模糊效果
# Android 实现图片模糊、高斯模糊、毛玻璃效果的三种方法
# Android 动态高斯模糊效果教程
# Android 高仿微信语音聊天页面高斯模糊(毛玻璃效果)
# Android项目实战之Glide 高斯模糊效果的实例代码
# Android RenderScript实现高斯模糊
# Android实现图片高斯模糊
# 高斯
# 的是
# 是一个
# 这一
# 是一种
# 最好的
# 大家都
# 也能
# 平台上
# 而在
# 要在
# 差强人意
# 得多
# 才有
# 不相上下
# 考虑到
# 在所难免
# 更快
# 可以看出
# 大大的
相关文章:
深圳 网站制作,深圳招聘网站哪个比较好一点啊?
制作公司内部网站有哪些,内网如何建网站?
创业网站制作流程,创业网站可靠吗?
如何通过wdcp面板快速创建网站?
如何用PHP快速搭建高效网站?分步指南
如何将凡科建站内容保存为本地文件?
建站之星微信建站一键生成小程序+多端营销系统
网站制作公司,橙子建站是合法的吗?
详解jQuery中基本的动画方法
厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?
如何在服务器上配置二级域名建站?
高配服务器限时抢购:企业级配置与回收服务一站式优惠方案
如何在阿里云香港服务器快速搭建网站?
如何配置WinSCP新建站点的密钥验证步骤?
网站企业制作流程,用什么语言做企业网站比较好?
制作门户网站的参考文献在哪,小说网站怎么建立?
香港服务器部署网站为何提示未备案?
为什么Go需要go mod文件_Go go mod文件作用说明
建站上传速度慢?如何优化加速网站加载效率?
浙江网站制作公司有哪些,浙江栢塑信息技术有限公司定制网站做的怎么样?
建站ABC备案流程中有哪些关键注意事项?
建站之星价格显示格式升级,你的预算足够吗?
实例解析angularjs的filter过滤器
做企业网站制作流程,企业网站制作基本流程有哪些?
如何打造高效商业网站?建站目的决定转化率
专业公司网站制作公司,用什么语言做企业网站比较好?
如何选择建站程序?包含哪些必备功能与类型?
如何在阿里云虚拟主机上快速搭建个人网站?
Python文件管理规范_工程实践说明【指导】
如何高效生成建站之星成品网站源码?
免费制作海报的网站,哪位做平面的朋友告诉我用什么软件做海报比较好?ps还是cd还是ai这几个软件我都会些我是做网页的?
建站之星如何配置系统实现高效建站?
深入理解Android中的xmlns:tools属性
整人网站在线制作软件,整蛊网站退不出去必须要打我是白痴才能出去?
宝盒自助建站智能生成技巧:SEO优化与关键词设置指南
建站一年半SEO优化实战指南:核心词挖掘与长尾流量提升策略
电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?
北京专业网站制作设计师招聘,北京白云观官方网站?
如何通过服务器快速搭建网站?完整步骤解析
济南网站建设制作公司,室内设计网站一般都有哪些功能?
如何基于云服务器快速搭建个人网站?
c# Task.Yield 的作用是什么 它和Task.Delay(1)有区别吗
建站主机类型有哪些?如何正确选型
建站VPS配置与SEO优化指南:关键词排名提升策略
如何高效完成独享虚拟主机建站?
如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?
网站制作模板下载什么软件,ppt模板免费下载网站?
c++怎么实现高并发下的无锁队列_c++ std::atomic原子变量与CAS操作【详解】
如何使用Golang安装API文档生成工具_快速生成接口文档
实例解析Array和String方法
*请认真填写需求信息,我们会在24小时内与您取得联系。