Android 实现高斯模糊效果及低版本兼容

文章介绍了如何在Android应用中使用RenderScript进行高斯模糊处理,强调了RenderScript的性能优势以及与Java和NDK的对比。同时提到了API17及以上版本的兼容问题及其解决方案。
摘要由CSDN通过智能技术生成

         

(项目效果图)

简单描述项目效果图的实现思路:

① 加载定义的xml的Layout

② 使用截屏方法获取当前窗口的Bitmap对象

③ 将Bitmap对象进行压缩及高斯模糊处理

④ 将处理过的模糊图对象作为①中所加载出来的Layout的Background

⑤ 将已经加入了模糊图对象的Layout添加到PopuWindow中并处理子条目的弹出方式

二、适用RenderScript实现高斯模糊

==========================

实现高斯模糊效果的方法有很多,可以用java来实现,可以使用NDK来实现,也可以使用本文推荐的方式来实现(也是使用了JNI的方式),至于为什么选择使用RenderScript方式来实现,必然有一定优点。

优点:RenderScript方式,速度极快,约为java方式100倍的速度,NDK方式20倍速度(不同图片质量测试所得结果不同,供参考)

缺点:API17以上有效。(但Google已提供向下兼容的方法,文章后面会有介绍)

下面是使用RenderScript方式的核心代码:

/************************

  • 高斯模糊处理

  • @param bitmap

  • @param context

  • @return

***********************/

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);

//设定模糊度(注:Radius最大只能设置25.f)

blurScript.setRadius(15.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;

}

该方法中注释描述的很清楚,但需要注意的是blurScript.setRadius();方法,该方法设定模糊度时Radius最大只能设置25.f,可能是对图片直接进行处理会导致模糊效果不好,故此值最大有效设定为25,但若想实现更深度的模糊效果,可以先压缩图片,降低图片的质量来实现更模糊的效果。

下方是图片的压缩处理方法:

/**

  • Compress image by pixel, this will modify image width/height.

  • @param imgPath image path

  • @param pixelW target pixel of width

  • @param pixelH target pixel of height

  • @return

*/

public static Bitmap ratio(String imgPath, float pixelW, float pixelH) {

BitmapFactory.Options newOpts = new BitmapFactory.Options();

// 开始读入图片,此时把options.inJustDecodeBounds 设回true,即只读边不读内容

newOpts.inJustDecodeBounds = true;

newOpts.inPreferredConfig = Config.RGB_565;

// Get bitmap info, but notice that bitmap is null now

Bitmap bitmap = BitmapFactory.decodeFile(imgPath,newOpts);

newOpts.inJustDecodeBounds = false;

int w = newOpts.outWidth;

int h = newOpts.outHeight;

float ww = pixelW; //设置宽度为120f,可以明显看到图片缩小了

float hh = pixelH; //设置高度为240f时,可以明显看到图片缩小了

//缩放比,由于是固定比例缩放,只用高或者宽其中一个数据进行计算即可

int be = 1;//表示不缩放

if (w > h && w > ww) { //如果宽度大的话根据宽度固定大小缩放

be = (int) (newOpts.outWidth / ww);

} else if (w < h && h > hh) { //如果高度高的话根据宽度固定大小缩放

be = (int) (newOpts.outHeight / hh);

}

if (be <= 0) be = 1;

newOpts.inSampleSize = be;//设置缩放比例

// 开始压缩图片,注意此时已经把options.inJustDecodeBounds 设回false了

bitmap = BitmapFactory.decodeFile(imgPath, newOpts);

// 压缩好比例大小后再进行质量压缩

//return compress(bitmap, maxSize); //这里再进行质量压缩的意义不大,反而耗资源,删除

return bitmap;

}

以上方法是使用 RenderScript来实现高斯模糊的核心代码块及需注意的地方。但是,还是需要注意兼容问题,上述有提到该方法仅适用于API17以上才有效,那么问题来了,需要处理API向下兼容问题。

三、处理API向下兼容问题及注意点

=====================

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

最后

对于很多初中级Android工程师而言,想要提升技能,往往是自己摸索成长。而不成体系的学习效果低效漫长且无助。时间久了,付出巨大的时间成本和努力,没有看到应有的效果,会气馁是再正常不过的。

所以学习一定要找到最适合自己的方式,有一个思路方法,不然不止浪费时间,更可能把未来发展都一起耽误了。

如果你是卡在缺少学习资源的瓶颈上,那么刚刚好我能帮到你。

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

能,往往是自己摸索成长。而不成体系的学习效果低效漫长且无助。时间久了,付出巨大的时间成本和努力,没有看到应有的效果,会气馁是再正常不过的。

所以学习一定要找到最适合自己的方式,有一个思路方法,不然不止浪费时间,更可能把未来发展都一起耽误了。

如果你是卡在缺少学习资源的瓶颈上,那么刚刚好我能帮到你。

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值