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输出文件配置 需求 一般我 ...
随机推荐
- 最近ES遇到discover老是失败问题,ping主节点和node节点正常,抓包发现了大量的retransmission、tcp out of order、dup ack问题。
最近ES遇到discover老是失败问题,ping主节点和node节点正常,抓包发现了大量的retransmission.tcp out of order.dup ack问题. Explanation ...
- jmap和jstack使用
http://blog.csdn.net/sinat_29581293/article/details/70214436
- js自定义对象.属性 笔记
<一> js自定义对象 一,概述 在Java语言中,我们可以定义自己的类,并根据这些类创建对象来使用,在Javascript中,我们也可以定义自己的类,例如定义User类.Hashtabl ...
- Python 读取window下UTF-8-BOM 文件
with open('target.txt', 'r', encoding='utf_8_sig') as fp: print(fp.read())
- hdu 6097 Mindis(数学几何,圆心的反演点)
Mindis Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Subm ...
- 学会使用Fidder抓取app的http请求(转)
fidder可以抓取http请求,抓取手机app上面的,自己pc的请求也可以截取,通过这样达到类似浏览器调试的效果,更容易找到问题. 使用原文链接:http://www.cnblogs.com/syf ...
- TCP的数据传输
TCP协议,传输控制协议(Transmission Control Protocol)是一种面向连接的.可靠的.基于字节流的传输层通信协议. TCP通信需要经过创建连接.数据传送.终止连接三个步骤. ...
- Spring警告: Could not load driverClass com.mysql.jdbc.Driver(待解决)
在一个Spring项目中,新建了一个外部属性文件db.properties,在xml文件中利用${}来引用db.properties文件里面的属性. beans-properties.xml: < ...
- Memcached 补充
Memcached 补充 Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站 ...
- 自己WIN7旗舰版安装 SQLServer2005/2008的一些总结
准备工作:下载安装包,当然要保证安装包能用: 安装:1.设置setup.exe文件 右键属性选择 --兼容,兼容下面选择---以管理员方式运行,---兼容模式选择windows xp或者windows ...