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输出文件配置 需求 一般我 ...
随机推荐
- ContentControl和ContentPresenter的应用
1:wpf中,所有的内容控件都继承自“ContentControl” ,所以我们可以直接应用“ContentControl”自定义我们“需要的”内容控件. 2:ContentControl具有Cont ...
- bzo1016: [JSOI2008]最小生成树计数
现在给出了一个简单无向加权图.你不满足于求出这个图的最小生成树,而希望知道这个图中有多少个不同的最小生成树.(如果两颗最小生成树中至少有一条边不同,则这两个最小生成树就是不同的).由于不同的最小生成树 ...
- leetcode算法总结
算法思想 二分查找 贪心思想 双指针 排序 快速选择 堆排序 桶排序 搜索 BFS DFS Backtracking 分治 动态规划 分割整数 矩阵路径 斐波那契数列 最长递增子序列 最长公共子系列 ...
- Java解析XML格式串(JDOM解析)
import java.io.IOException; import java.io.StringReader; import java.util.List; import org.jdom.Docu ...
- day39 算法基础
参考博客: http://www.cnblogs.com/alex3714/articles/5474411.html http://www.cnblogs.com/wupeiqi/articles/ ...
- IHTMLDocument2 TO IWebBrowser2
if(NULL != pIHTMLDocument2) { IHTMLWindow2* pIHTMLWindow2 = NULL; hr = pIHTMLDocument2->get_paren ...
- vue创建组件
vue创建组件是很容易的: js: Vue.component("component-item",{ //component-item就是我们在HTML页面上引用的组件,它会在 ...
- 【2018多校第一场】hdu6308-Time Zone(日期)
Problem Description Chiaki often participates in international competitive programming contests. The ...
- idea git tag 管理
项目release 之后一般都会打一个tag 做记录.本人使用idea管理tag的时候,遇到的问题做一些记录. 1:idea 创建tag idea 创建tag ,我们可以右键项目,然后按照下图操作创建 ...
- js 多个倒计时,毫秒倒计时
其实主要是借鉴了了这篇文的写法(http://tuzwu.iteye.com/blog/819081),俺稍作了修改,以便更适合我的需要: 实现功能:调用一个函数,传入html元素的id,和一个截止时 ...