Android 图像模糊处理

2023-11-18

         近期接触到了图像模糊处理,用了一些办法可以实现但交互效果不好;在Github上找到的,试了一些办法,觉得还是以下方法 比较靠谱,大致分为两种,一种是RenderScript 、一种是国外提供的一种---高斯算法。上代码,来看看

          首先来看看android系统自带的图像模糊处理方法,该方法ScriptIntrinsicBlur只支持API17以上,当让也可以通过Renderscript 的support  lib降低版本处理,这里不做过多的解释了。使用该方法是需要先调用下View的addOnPreDrawListener方法预加载,

image.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
                @Override
                public boolean onPreDraw() {
                    image.getViewTreeObserver().removeOnPreDrawListener(this);
                    image.buildDrawingCache();
                    Bitmap bmp = image.getDrawingCache();
                    blur(bmp, text);
                    return true;
                }
         });

  @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
  private void blur(Bitmap bkg, View view) {
       long startMs = System.currentTimeMillis();
       float radius = 20;
       Bitmap overlay = Bitmap.createBitmap((int) (view.getMeasuredWidth()),
       (int) (view.getMeasuredHeight()), Bitmap.Config.ARGB_8888);
       Canvas canvas = new Canvas(overlay);
       canvas.translate(-view.getLeft(), -view.getTop());
       canvas.drawBitmap(bkg, 0, 0, null);
       RenderScript rs = RenderScript.create(getActivity());
       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();

重点说一下 第二中方法,FastBlur其实也就是对图片的像素处理,看看代码,刚开始对这些处理不太理解,找了些资料了解下

private void blur(Bitmap bkg, View view) {
        long startMs = System.currentTimeMillis();
        float scaleFactor = 1;
        float radius = 20;
        if (downScale.isChecked()) {
            scaleFactor = 8;
            radius = 2;
        }
 }
提供了需要缩小的等级,在代码中我把bitmap的尺寸缩小到原图的1/8。因为这个bitmap在模糊处理时会先被缩小然后再放大,所以在我的模糊算法中就不用radius这个参数了,所以把它设成2

 
    Bitmap overlay = Bitmap.createBitmap((int) (view.getMeasuredWidth()/scaleFactor),
               (int) (view.getMeasuredHeight()/scaleFactor), Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(overlay);
    canvas.translate(-view.getLeft()/scaleFactor, -view.getTop()/scaleFactor);
    canvas.scale(1 / scaleFactor, 1 / scaleFactor);
    Paint paint = new Paint();
    paint.setFlags(Paint.FILTER_BITMAP_FLAG);
    Paint提供了FILTER_BITMAP_FLAG标示,这样的话在处理bitmap缩放的时候,就可以达到双缓冲的效果,模糊处理的过程就更加顺畅了</span>
    canvas.drawBitmap(bkg, 0, 0, paint);
    overlay = FastBlur.doBlur(overlay, (int)radius, true);
    view.setBackground(new BitmapDrawable(getResources(), overlay))
总结下:Android中渲染一帧的时间应该不超过16ms(60fps),但如果在UI线程中做模糊处理就会让帧率降到了17fps。即便是放到了async中也不会快多少,交互不是很好,

而,FastBlur的原理则是 ,先压缩图片后模糊然后放大图片,这样以来速度得到了很好的提升。  


GitHub





本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android 图像模糊处理 的相关文章

  • 应用程序未安装在 Android 模拟器上

    我正在 android Geocoder 中开发一个应用程序 当我运行该应用程序时 它会显示 2011 01 11 11 08 13 GeoTourProject 自动目标模式 使用现有模拟器 emulator 5554 运行兼容的 AVD
  • minHeight 有什么作用吗?

    在附图中 我希望按钮列与图像的高度相匹配 但我也希望按钮列有一个最小高度 它正确匹配图像的高度 但不遵守 minHeight 并且会使按钮向下滑动 我正在为按钮列设置这些属性
  • 无法理解 Java 地图条目集

    我正在看一个 java 刽子手游戏 https github com leleah EvilHangman blob master EvilHangman java https github com leleah EvilHangman b
  • Clip 在 Java 中播放 WAV 文件时出现严重延迟

    我编写了一段代码来读取 WAV 文件 大小约为 80 mb 并播放该文件 问题是声音播放效果很差 极度滞后 你能告诉我有什么问题吗 这是我的代码 我称之为doPlayJframe 构造函数内的函数 private void doPlay f
  • MediaCodec 创建输入表面

    我想使用 MediaCodec 将 Surface 编码为 H 264 使用 API 18 有一种方法可以通过调用 createInputSurface 然后在该表面上绘图来对表面中的内容进行编码 我在 createInputSurface
  • Java中接口作为方法参数

    前几天去面试 被问到了这样的问题 问 反转链表 给出以下代码 public class ReverseList interface NodeList int getItem NodeList nextNode void reverse No
  • 从 android 简单上传到 S3

    我在网上搜索了从 android 上传简单文件到 s3 的方法 但找不到任何有效的方法 我认为这是因为缺乏具体步骤 1 https mobile awsblog com post Tx1V588RKX5XPQB TransferManage
  • 反思 Groovy 脚本中声明的函数

    有没有一种方法可以获取 Groovy 脚本中声明的函数的反射数据 该脚本已通过GroovyShell目的 具体来说 我想枚举脚本中的函数并访问附加到它们的注释 Put this到 Groovy 脚本的最后一行 它将作为脚本的返回值 a la
  • 使用 Matrix.setPolyToPoly 选择位图上具有 4 个点的区域

    我正在 Android 上使用位图 在使用 4 个点选择位图上的区域时遇到问题 并非所有 4 点组都适合我 在某些情况下 结果只是一个空白位图 而不是裁剪后的位图 如图所示 并且 logcat 中没有任何错误 甚至是内存错误 这是我用来进行
  • 调节麦克风录音音量

    我们正在尝试调整录音时的音量级别 麦克风似乎非常敏感 会接收到很多静电 我们查看了 setVolumeControlStream 但找不到传入其中来控制麦克风的流 将您的音频源设置为 MIC using MediaRecorder Audi
  • 如何将设备连接到Eclipse?

    我无法解决这个简单的问题 我正在尝试通过 USB 电缆将我的设备连接到 Eclipse 在我的 PC 上 我已经安装了 Eclipse 和 Android SDK 并且在模拟器上运行该程序运行良好 我已在我的电脑上下载并安装了 Samsun
  • 在 Android 上按下电源按钮时,如何防止先调用 onDestroy() 再调用 onCreate()

    我正在记录每个 onCreate 和 onDestroy 调用 我发现 一旦我单击 Android 上的电源按钮 以及模拟器上的电源按钮 我的活动中就会拨打电话 gt onDestroy gt onCreate 这会杀死我的游戏 然后立即从
  • 下载后从谷歌照片库检索图像

    我正在发起从图库中获取照片的意图 当我在图库中使用 Nexus 谷歌照片应用程序时 一切正常 但如果图像不在手机上 在 Google Photos 在线服务上 它会为我下载 选择图像后 我将图像发送到另一个活动进行裁剪 但在下载的情况下 发
  • 使用 Flyway 和 Hibernate 的 hbm2ddl 在应用程序的生命周期中管理数据库模式

    我正在开发 Spring Hibernate MySql 应用程序 该应用程序尚未投入生产 我目前使用 Hibernatehbm2ddl该功能对于管理域上的更改非常方便 我也打算用Flyway用于数据库迁移 在未来的某个时候 该应用程序将首
  • 应用程序关闭时的倒计时问题

    我制作了一个 CountDownTimer 代码 我希望 CountDownTimer 在完成时重新启动 即使应用程序已关闭 但它仅在应用程序正在运行或重新启动应用程序时重新启动 因此 如果我在倒计时为 00 10 分钟 秒 时关闭应用程序
  • 休眠以持久保存日期

    有没有办法告诉 Hibernate java util Date 应该持久保存 我需要这个来解决 MySQL 中缺少的毫秒分辨率问题 您能想到这种方法有什么缺点吗 您可以自己创建字段long 或者使用自定义的UserType 实施后User
  • 在webview android中加载本地html文件

    我正在尝试在 android 的 webview 中加载 html 文件的内容 但是 它给了我 网页不可用错误 如果我尝试使用谷歌或雅虎等网站 它们就会起作用 html文件位于src gt main gt assests gt index
  • 在 Android 中,如何将字符串从 Activity 传递到 Service?

    任何人都可以告诉如何将字符串或整数从活动传递到服务 我试图传递一个整数 setpossition 4 但它不需要 启动时总是需要 0 Service 我不知道为什么我不能通过使用 Service 实例从 Activity 进行操作 publ
  • 无法运行我的应用程序,要求选择 Android SDK

    今天我已经安装了Android Studio 金丝雀 1 现在我无法运行我的应用程序 将出现以下对话框 我已经通过 文件 gt 项目结构 gt Android SDK 位置 设置了正确的 SDK 位置 期待您的帮助来解决这个问题 警告对话框
  • javax.persistence.Table.indexes()[Ljavax/persistence/Index 中的 NoSuchMethodError

    我有一个 Play Framework 应用程序 并且我was使用 Hibernate 4 2 5 Final 通过 Maven 依赖项管理器检索 我决定升级到 Hibernate 4 3 0 Final 成功重新编译我的应用程序并运行它

随机推荐

  • Go语言实现区块链与加密货币-Part1(基本原型、工作量证明、持久化)

    区块链 Blockchain 是21世纪最具革命性的技术之一 它仍然处于不断成长的阶段 而且还有很多潜力尚未显现 作为比特币的底层技术 它本质上只是一个分布式数据库 不过使它独一无二的是 区块链是一个公开的而不是私人的数据库 每个使用它的人
  • 使用Arduino开发ESP32(22):蓝牙作为客户端使用

    文章目录 目的 基础准备 搜索蓝牙设备 搜索设备 信息查询 连接与交互 总结 目的 ESP32的蓝牙除了作为服务器 从设备 使用还可以作为客户端 主机 使用 这篇文章将对相关内容做个简单说明 基础准备 这篇文章中测试需要先准备一个蓝牙服务器
  • 字符串翻转

    给定两个字符串 s和goal 如果在若干次旋转操作之后 s能变成goal 那么返回true s的旋转操作就是将s最左边的字符移动到最右边 例如 若s abcde 在旋转一次之后结果就是 bcdea 示例 1 输入 s abcde goal
  • Go Flutter Desktop (一) 初探

    Flutter 在去年的时候就有一个第三方的桌面引擎 是用 golang 开发的 Github 地址是 https github com go flutter desktop go flutter 目前在 mac linux windows
  • $confirm的自定义使用

    confirm的自定义使用 在项目开发过程中 经常会遇到需要修改ui库中默认样式的情况 就比如说使用element ui的 confirm弹出框时 它的默认样式如下 但我们需要的是 这样一个布局样式 这时我们就需要对默认样式进行一个自定义修
  • 华为OD机试 - 约瑟夫问题(Java)

    题目描述 输入一个由随机数组成的数列 数列中每个数均是大于 0 的整数 长度已知 和初始计数值 m 从数列首位置开始计数 计数到 m 后 将数列该位置数值替换计数值 m 并将数列该位置数值出列 然后从下一位置从新开始计数 直到数列所有数值出
  • [Agent]开发---csvAgent开发

    资料 https python langchain com docs integrations toolkits csv csvagent需要csv文件和模型 该方法在后台使用pandas方法去处理该文件 然后调用LLM去回答问题 我们使用
  • Linux网络服务:网络设置与基础服务2

    目录 一 理论 1 FTP服务 2 配置文件路径 3 FTP配置文件解析 4 配置本地用户访问ftp 二 实验 1 匿名用户访问FTP服务器 2 普通用户访问FTP服务器 3 FTP服务器黑白名单 4 问题 一 理论 1 FTP服务 1 F
  • 第十四章 kafka专题之日志数据删除策略

    日志数据清理 为了控制磁盘的容量 需要对过去的消息进行清理 1 内部定时任务检测删除日志 默认是5分钟 2 日志清理参数配置 支持配置策略对数据进行清理 以segment为基本单位进行定期清理 当前正在使用的segment不会被清理 启用c
  • Unity中的旋转方式

    1 transform rotation 赋值四元数 float x void Update x Time deltaTime 10 transform rotation Quaternion Euler x 0 0 Euler 返回一个旋
  • 分布式事务利器——RocketMQ事务消息的启示

    一 大事务 小事务 异步 我们以一个转帐的场景为例来说明这个问题 Bob向Smith转账100块 这个列子在瓜子也有很多实际场景映射 如 车源状态变化 订单状态变化 金融放款 物流运输 在单机环境下 执行事务的情况 大概是下面这个样子 当用
  • 2023-ISCC信息安全与对抗竞赛wp-misc(详解,有脚本( •̀ ω •́ ),脚本解析,有附件)

    芜湖 芜湖 没想到不知不觉今年这一届就算结束了 真可谓真是八仙过海各显神通呀 本文章我们只讨论题 别的不讨论 题目还是很不错 我只是题目的搬运工 进入正题 以下是本人的一些解题思路和过程 供各位道友参考 对了不要喷呀 如有错误或者心得请联系
  • 值得推荐的13款可视化软件,快收藏!

    数据可视化力求用图表结合的方式把所有的数据整合在某一图像上 这样呈现在观众眼前的画面不仅仅是美观 且比以往长篇大论或是密密麻麻的数据表格更直观易懂 更便于观察分析 到今年上半年为止 国内外已经有了很多发展的较好的数据可视化软件 接下来给大家
  • 12. 数据类型 - 集合详解

    Hi 大家好 我是茶桁 通过最近几节课的内容 我们已经了解到了大部分的容器类数据的特性和应用 今天这一节课是容器类数据的最后一部分 让我们今天来详细了解一下 集合 集合是确定的一组无序的数据的组合 注意这一句话中的几个概念 首先是 确定的
  • 怎么讲服务器上的文件装进电脑,怎么把电脑文件放进云服务器

    怎么把电脑文件放进云服务器 内容精选 换一换 Winscp无法连接到服务器 SSH连接工具例如Xshell可以正常连接云服务器 其他SSH工具连接云服务器正常 但是Winscp无法连接到服务器 说明SSH服务是没有问题的 Winscp连接基
  • 使用notepad++批量在每行首尾添加内容

    1 简介 在程序员开发过程中 一个不错的工具是notepad 该工具为notepad的增强 增强了许多的功能 包括程序员喜欢的列块编辑模式 支持众多的插件 例如json格式化 支持markdown语法 一种场景是这样的 比如说上传的工资单中
  • TortoiseGit(小乌龟)设置保存账号密码

    在我们使用Tortoise git 时 默认是需要在每次提交代码时输入你的账号和密码的 这样在实际使用时会觉得非常繁琐且费时 于是我们可以简单设置下配置文件 便可保存下账号密码 下次在使用时就不必再次手动输入 点击 Git 选项 然后点击右
  • C-NOIP1998P3 二的幂次方

    include
  • ARMV8体系结构简介:exclusive monitor

    为了支持exclusive操作 硬件会增加exclusive monitor来支持 一 exclusive monitor exclusive monitor分为2类 local monitor 实现在cpu内部 针对cacheable属性
  • Android 图像模糊处理

    近期接触到了图像模糊处理 用了一些办法可以实现但交互效果不好 在Github上找到的 试了一些办法 觉得还是以下方法 比较靠谱 大致分为两种 一种是RenderScript 一种是国外提供的一种 高斯算法 上代码 来看看 首先来看看andr