Android模糊图像
在2014年某次会议的讲演《图像的魔力》中,我介绍了当中的一部分。
当中的一项技术是怎样模糊图像。演示样例代码是使用RenderScript实现的,由于在Android中没有内置的可使用的简单的API。在这个系列中,我们将着眼于RenderScript模糊技术和JAVA实现模糊功能。我们还将进行一些基准測试。以了解每种方案的运行情况,并探讨获取最佳性能的可行方法。
本地语法基于C99。与OpenCL, CUDA, and GLSL的API类似。
此外,我们使用的模糊核心在API17后才引入,所以有最小SDK版本号为17的需求。
- <?xml version="1.0" encoding="utf-8"?
>
- <RelativeLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:gravity="center"
- android:orientation="vertical" >
- <ImageView
- android:id="@+id/image"
- android:src="@drawable/broadstairs"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:scaleType="matrix"
- android:layout_centerInParent="true"/>
- <TextView
- android:id="@+id/text"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="@string/hello"
- android:layout_centerHorizontal="true"
- android:textColor="<a href="http://www.jobbole.com/members/android/" rel="nofollow">@android</a>:color/white"
- android:layout_marginTop="300dp"
- android:textStyle="bold"
- android:textSize="48sp"/>
- </RelativeLayout>
复制代码

这样让随后的位置计算简单些,而且这里讨论的是模糊技术而不是图像定位的数学算法。尝试设定ImageView的属性android:scaleType=”center”,就会发现定位出现错乱。
- 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内存区域中创建和引用对象的方式,为我们的位图创建一个分配会将位图的内容拷贝的分配区域中(14-15行)。
我保证在接下来的文章中进行调整。
我们介绍了使用RenderScript使还有一个视图范围内的图片部分模糊。
可是实际上。我们并没有深入地调用这种方法来研究图像模糊行为。
原因是我们须要在性能方面进行细致考虑。这篇文章我们会进行更进一步地的探索。
当中,OnDraw会降低帧速率。你能够不相信我的做法,可是能够通过測量并证明它是有效的。
在后面的系列中,我们就会这样做。
当我们收到布局已经改变的通知时,注冊的OnPreDrawListener监听函数的onPreDraw()方法会被调用每当运行onDraw方法。
我们要做的第一件事情就是取消注冊onPreDraw()方法。这样仅仅有在布局改变的时候才会被调用,而不是每次onDraw方法触发时都调用。
以下能够运行模糊方法。从这种方法的返回值非常重要,使用它能够让我们放弃onDraw操作。反复之前的布局。这对在回调函数中改动布局非常有帮助,可是这里不须要这么做。所以返回true,继续绘制。
- public class MainActivity extends Activity {
- private ImageView mImage;
- private TextView mText;
- private OnPreDrawListener mPreDrawListener =
- new OnPreDrawListener() {
- @Override
- public boolean onPreDraw() {
- ViewTreeObserver observer = mText.getViewTreeObserver();
- if(observer != null) {
- observer.removeOnPreDrawListener(this);
- }
- Drawable drawable = mImage.getDrawable();
- if (drawable != null &&
- drawable instanceof BitmapDrawable) {
- Bitmap bitmap =
- ((BitmapDrawable) drawable).getBitmap();
- if (bitmap != null) {
- blur(bitmap, mText, 25);
- }
- }
- return true;
- }
- };
- private OnGlobalLayoutListener mLayoutListener =
- new OnGlobalLayoutListener() {
- @Override
- public void onGlobalLayout() {
- ViewTreeObserver observer = mText.getViewTreeObserver();
- if(observer != null) {
- observer.addOnPreDrawListener(
- mPreDrawListener);
- }
- }
- };
- /**
- * Called when the activity is first created.
- */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- mImage = (ImageView) findViewById(R.id.image);
- mText = (TextView)findViewById(R.id.text);
- if (mImage != null && mText != null) {
- ViewTreeObserver observer =
- mText.getViewTreeObserver();
- if (observer != null) {
- observer.addOnGlobalLayoutListener(
- mLayoutListener);
- }
- }
- }
- private void blur(Bitmap bkg, View view, float radius) {
- ....
- }
- }
复制代码

at=Part2" rel="nofollow">这里
。Android模糊图像的更多相关文章
- Android图像处理 - 高斯模糊的原理及实现
欢迎大家前往云+社区,获取更多腾讯海量技术实践干货哦~ 由 天天P图攻城狮 发布在云+社区 作者简介:damonxia(夏正冬),天天P图Android工程师 前言 高斯模糊是图像处理中几乎每个程序员 ...
- 【原】Android热更新开源项目Tinker源码解析系列之三:so热更新
本系列将从以下三个方面对Tinker进行源码解析: Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Android热更新开源项目Tinker源码解析系列之二:资源文件热更新 A ...
- 配置android sdk 环境
1:下载adnroid sdk安装包 官方下载地址无法打开,没有vpn,使用下面这个地址下载,地址:http://www.android-studio.org/
- Android SwipeRefreshLayout 下拉刷新——Hi_博客 Android App 开发笔记
以前写下拉刷新 感觉好费劲,要判断ListView是否滚到顶部,还要加载头布局,还要控制 头布局的状态,等等一大堆.感觉麻烦死了.今天学习了SwipeRefreshLayout 的用法,来分享一下,有 ...
- Android Studio配置 AndroidAnnotations——Hi_博客 Android App 开发笔记
以前用Eclicps 用习惯了现在 想学学 用Android Studio 两天的钻研终于 在我电脑上装了一个Android Studio 并完成了AndroidAnnotations 的配置. An ...
- Android请求网络共通类——Hi_博客 Android App 开发笔记
今天 ,来分享一下 ,一个博客App的开发过程,以前也没开发过这种类型App 的经验,求大神们轻点喷. 首先我们要创建一个Andriod 项目 因为要从网络请求数据所以我们先来一个请求网络的共通类. ...
- 【原】Android热更新开源项目Tinker源码解析系列之一:Dex热更新
[原]Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Tinker是微信的第一个开源项目,主要用于安卓应用bug的热修复和功能的迭代. Tinker github地址:http ...
- 【原】Android热更新开源项目Tinker源码解析系列之二:资源文件热更新
上一篇文章介绍了Dex文件的热更新流程,本文将会分析Tinker中对资源文件的热更新流程. 同Dex,资源文件的热更新同样包括三个部分:资源补丁生成,资源补丁合成及资源补丁加载. 本系列将从以下三个方 ...
- Android Studio 多个编译环境配置 多渠道打包 APK输出配置
看完这篇你学到什么: 熟悉gradle的构建配置 熟悉代码构建环境的目录结构,你知道的不仅仅是只有src/main 开发.生成环境等等环境可以任意切换打包 多渠道打包 APK输出文件配置 需求 一般我 ...
随机推荐
- Java笔试之输入输出
在校招笔试中,有的时候我们要自己设计输入输出,下面罗列一些常见的输入输出: 首先把输入包加载进来: import java.util.* ; 一 ,输入 1,输入一个整数,浮点数,输入一个数组 : p ...
- C++函数参数中的省略号
本文基本是转载自:https://blog.csdn.net/think12/article/details/5785066 另一篇看到写得很好的博客:https://www.cnblogs.com/ ...
- day27 CRM delete& action& 嵌入CRM
课程目录:deleteactionpop up window嵌入crm项目 权限(未讲)学员交作业发邮件 代码路径:https://github.com/liyongsan/git_class/tre ...
- 转:基于Flume的美团日志收集系统(一)架构和设计
美团的日志收集系统负责美团的所有业务日志的收集,并分别给Hadoop平台提供离线数据和Storm平台提供实时数据流.美团的日志收集系统基于Flume设计和搭建而成. <基于Flume的美团日志收 ...
- Annotation方式实现AOP
1.添加其他jar包 2.配置applicationContext.xml文件 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 <?xml version=&quo ...
- Linux下常用压缩、解压缩命令
常用的压缩工具 一是单纯的单文件压缩工具,主要有compress,gzip,bzip2. 二是打包压缩工具,也是最常用的,tar 压缩比:compress<gzip<bzip2 co ...
- LINUX系统下CIFS文件系统
一.什么是CIFS CIFS(Common Internet File System)文件系统,也叫通用网络文件系统:它可以使一台主机访问远程主机上共享出去的文件.CIFS使用的C/S模式(客户 ...
- iOS开发之如何应对苹果app的ipv6时代?
WWDC2015苹果宣布在ios9支持纯IPv6的网络服务,并且要求2016年提交到app store的应用必须兼容纯IPv6的网络,要求适配的系统版本是ios9以上(包括ios9). 一 背景介绍 ...
- 使用编译时注解简单实现类似 ButterKnife 的效果
这篇文章是学习鸿洋前辈的 Android 如何编写基于编译时注解的项目 的笔记,用于记录我的学习收获. 读完本文你将了解: 什么是编译时注解 APT 编译时注解如何使用与编写 举个例子 思路 创建注解 ...
- ss-libev 源码解析udp篇 (1)
shadowsocks-libev udp转发原理简介 ss_local作为一个sock5服务器,接收来自socks5客户端的数据包.在ss_local启动后,即创建一个udp socket,并bin ...