关于Android中对图片进行模糊处理的方法

OpenHarmony实战——ArkUI框架:图片模糊处理的实现 我们根据像素点的r、g、b值,得到M点的像素点值,就这样,一个一个像素点的操作,中间点相当于失去视觉上的焦点,整个图片就产生模糊的效果。但这样一边倒的方式,在模糊的效果上,达不到需求的,所以,我们就需要根据这个模糊的本质概念,去想想,加一些东西或者更改取平均值的规则,完成我们想要的效果。这样我们在计算图片的焦点像素值时,将该点当作中心点,当作1的权重,其他周围的点,按照该正态分布的位置,去分配它的权重,这样我们就可以根据该正态分布函数及其各个点的像素ARGB值,算出经过正态分布之后的像素ARGB值。 阅读详情

方法一:

github上的开源代码,Fastblur高斯模糊

源码:
package com.example.blur_csdn;  
import android.graphics.Bitmap;  

public class FastBlur {  

    public static Bitmap doBlur(Bitmap sentBitmap, int radius,boolean canReuseInBitmap)   
    {  
        Bitmap bitmap;  
        if (canReuseInBitmap) {  
            //可复用视图  
            bitmap = sentBitmap;  
        } else {  

            bitmap = sentBitmap.copy(sentBitmap.getConfig(), true);  
        }  

        if (radius < 0) {  
            return (null);  
        }  

        int w = bitmap.getWidth();  
        int h = bitmap.getHeight();  

        int[] pix = new int[w * h];  
        bitmap.getPixels(pix, 0, w, 0, 0, w, h);  

        int wm = w - 1;  
        int hm = h - 1;  
        int wh = w * h;  
        int div = radius + radius + 1;  

        int r[] = new int[wh];  
        int g[] = new int[wh];  
        int b[] = new int[wh];  
        int rsum, gsum, bsum, x, y, i, p, yp, yi, yw;  
        int vmin[] = new int[Math.max(w, h)];  

        int divsum = (div + 1) >> 1;  
        divsum *= divsum;  
        int dv[] = new int[256 * divsum];  
        for (i = 0; i < 256 * divsum; i++) {  
            dv[i] = (i / divsum);  
        }  

        yw = yi = 0;  

        int[][] stack = new int[div][3];  
        int stackpointer;  
        int stackstart;  
        int[] sir;  
        int rbs;  
        int r1 = radius + 1;  
        int routsum, goutsum, boutsum;  
        int rinsum, ginsum, binsum;  

        for (y = 0; y < h; y++) {  
            rinsum = ginsum = binsum = routsum = goutsum = boutsum = rsum = gsum = bsum = 0;  
            for (i = -radius; i <= radius; i++) {  
                p = pix[yi + Math.min(wm, Math.max(i, 0))];  
                sir = stack[i + radius];  
                sir[0] = (p & 0xff0000) >> 16;  
                sir[1] = (p & 0x00ff00) >> 8;  
                sir[2] = (p & 0x0000ff);  
                rbs = r1 - Math.abs(i);  
                rsum += sir[0] * rbs;  
                gsum += sir[1] * rbs;  
                bsum += sir[2] * rbs;  
                if (i > 0) {  
                    rinsum += sir[0];  
                    ginsum += sir[1];  
                    binsum += sir[2];  
                } else {  
                    routsum += sir[0];  
                    goutsum += sir[1];  
                    boutsum += sir[2];  
                }  
            }  
            stackpointer = radius;  

            for (x = 0; x < w; x++) {  

                r[yi] = dv[rsum];  
                g[yi] = dv[gsum];  
                b[yi] = dv[bsum];  

                rsum -= routsum;  
                gsum -= goutsum;  
                bsum -= boutsum;  

                stackstart = stackpointer - radius + div;  
                sir = stack[stackstart % div];  

                routsum -= sir[0];  
                goutsum -= sir[1];  
                boutsum -= sir[2];  

                if (y == 0) {  
                    vmin[x] = Math.min(x + radius + 1, wm);  
                }  
                p = pix[yw + vmin[x]];  

                sir[0] = (p & 0xff0000) >> 16;  
                sir[1] = (p & 0x00ff00) >> 8;  
                sir[2] = (p & 0x0000ff);  

                rinsum += sir[0];  
                ginsum += sir[1];  
                binsum += sir[2];  

                rsum += rinsum;  
                gsum += ginsum;  
                bsum += binsum;  

                stackpointer = (stackpointer + 1) % div;  
                sir = stack[(stackpointer) % div];  

                routsum += sir[0];  
                goutsum += sir[1];  
                boutsum += sir[2];  

                rinsum -= sir[0];  
                ginsum -= sir[1];  
                binsum -= sir[2];  

                yi++;  
            }  
            yw += w;  
        }  
        for (x = 0; x < w; x++) {  
            rinsum = ginsum = binsum = routsum = goutsum = boutsum = rsum = gsum = bsum = 0;  
            yp = -radius * w;  
            for (i = -radius; i <= radius; i++) {  
                yi = Math.max(0, yp) + x;  

                sir = stack[i + radius];  

                sir[0] = r[yi];  
                sir[1] = g[yi];  
                sir[2] = b[yi];  

                rbs = r1 - Math.abs(i);  

                rsum += r[yi] * rbs;  
                gsum += g[yi] * rbs;  
                bsum += b[yi] * rbs;  

                if (i > 0) {  
                    rinsum += sir[0];  
                    ginsum += sir[1];  
                    binsum += sir[2];  
                } else {  
                    routsum += sir[0];  
                    goutsum += sir[1];  
                    boutsum += sir[2];  
                }  

                if (i < hm) {  
                    yp += w;  
                }  
            }  
            yi = x;  
            stackpointer = radius;  
            for (y = 0; y < h; y++) {  
                // Preserve alpha channel: ( 0xff000000 & pix[yi] )  
                pix[yi] = (0xff000000 & pix[yi]) | (dv[rsum] << 16)  
                        | (dv[gsum] << 8) | dv[bsum];  

                rsum -= routsum;  
                gsum -= goutsum;  
                bsum -= boutsum;  

                stackstart = stackpointer - radius + div;  
                sir = stack[stackstart % div];  

                routsum -= sir[0];  
                goutsum -= sir[1];  
                boutsum -= sir[2];  

                if (x == 0) {  
                    vmin[y] = Math.min(y + r1, hm) * w;  
                }  
                p = x + vmin[y];  

                sir[0] = r[p];  
                sir[1] = g[p];  
                sir[2] = b[p];  

                rinsum += sir[0];  
                ginsum += sir[1];  
                binsum += sir[2];  

                rsum += rinsum;  
                gsum += ginsum;  
                bsum += binsum;  

                stackpointer = (stackpointer + 1) % div;  
                sir = stack[stackpointer];  

                routsum += sir[0];  
                goutsum += sir[1];  
                boutsum += sir[2];  

                rinsum -= sir[0];  
                ginsum -= sir[1];  
                binsum -= sir[2];  

                yi += w;  
            }  
        }  

        bitmap.setPixels(pix, 0, w, 0, 0, w, h);  

        return (bitmap);  
    }  
}  

方法二:

RenderScript:Android从API11开始

源码:
public Bitmap blurBitmap(Bitmap bitmap){  

        //Let's create an empty bitmap with the same size of the bitmap we want to blur  
        Bitmap outBitmap = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Config.ARGB_8888);  

        //Instantiate a new Renderscript  
        RenderScript rs = RenderScript.create(getApplicationContext());  

        //Create an Intrinsic Blur Script using the Renderscript  
        ScriptIntrinsicBlur blurScript = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs));  

        //Create the Allocations (in/out) with the Renderscript and the in/out bitmaps  
        Allocation allIn = Allocation.createFromBitmap(rs, bitmap);  
        Allocation allOut = Allocation.createFromBitmap(rs, outBitmap);  

        //Set the radius of the blur  
        blurScript.setRadius(25.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);  

radius如果设置的过大的话很容易oom,一般写15或者25左右吧。

需要注意的是如果你使用RenderScript就会存在兼容性问题,解决办法是
使用SDKbuild-tools\21.1.2\renderscript\lib目录下的renderscript-v8.jar

注意:如果你用的AndroidSudio,有人说直接在built.gradle中

 defaultConfig {
 ...

 renderscriptTargetApi 15
 renderscriptSupportModeEnabled true
 }

我试过,不好使。可能有的人好使吧……
如果你试过不行的话,还是按我说的导jar包吧

Android 图片高斯模糊处理 通过以上步骤,我们可以在Android应用中实现图片的高斯模糊处理。请确保在使用高斯模糊处理时,导时,导入了正确的依赖库,并按照上述代码进行正确的调用。在Android开发中,图片处理是一个常见的需求,其中高斯模糊是一种常用的效果之一。本文将介绍如何在Android应用中实现图片的高斯模糊处理,并提供相应的源代码。请注意,你需要根据自己的布局文件和资源文件来修改代码中的相关部分,例如。在上述代码中,我们首先获取ImageView中的Bitmap对象,然后使用。方法中获取了ImageView的实例,并调用。 阅读详情

相关推荐

Android 图片模糊的2种方法

Android图片模糊的2种方法,一种Java层,一种C++层,2种方式,优缺点都写在文件里了,大家随意下载。我这是Java文件,可以直接粘贴到工程中使用

Android Bitmap 使用Vukan、RenderEffect、GLSL实现模糊

使用 Vukan 模糊 使用 RenderEffect 模糊 使用 GLSL 模糊 RS、Vukan、RenderEffect、GLSL 效率对比

分享Android应用和系统开发、音视频编码、性能优化相关知识 4024

android图片模糊效果(毛玻璃)

FastBlur图片模糊效果,亲试确实可行,已经加到项目中去。直接复制,简单易用,小白都会。

android bitmap 高斯模糊,Android实现Bitmap高斯模糊效果

Android实现Bitmap高斯模糊效果自定义高斯模糊工具类import android.content.Context;import android.graphics.Bitmap;import android.renderscript.Allocation;import android.renderscript.Element;import android.renderscript.Rend...

weixin_36064484的博客 598

OpenCV的图像模糊与否检测

综合了几种检测方法,vs2013编译通过。Tenengrad梯度方法利用Sobel算子分别计算水平和垂直方向的梯度,同一场景下梯度值越高,图像越清晰。图像模糊与否的一种检测方法,该方法主要采用图像的拉普拉斯卷积操作。

Android 图片毛玻璃的实现方法,高斯模糊处理图片

Android 图片毛玻璃的实现方法,高斯模糊处理图片,模糊图片 内含源码及apk文件

android bitmap 模糊,【Android实战】Bitmap图片的截屏、模糊处理、传递、使用

项目中遇到了这样一个需求:当某个条件满足时就截取当前屏幕。并跳转到另外一个页面,同一时候将这个截屏图片作为下一个页面的背景图片,同一时候背景图片须要模糊处理接下来就一步一步解决这个问题:1、截取无状态栏的当前屏幕图片。请參考takeScreenShot方法2、使图片高斯模糊的方法请參考blurBitmap方法注意:RenderScript是Android在API 11之后增加的,用于高效的图片处理...

weixin_39791653的博客 575

Android studio虚拟机在启动界面和桌面出现画面模糊花屏问题的解决方法

主要介绍了解决Android studio虚拟机在启动界面和桌面出现画面模糊花屏问题,本文通过图文并茂的形式给大家介绍的非常详细,需要的朋友可以参考下

android判断图片是否模糊,Android 图片模糊 性能总结

转载请标明出处:http://blog..net/tyzlmjj/article/details/50823292本文出自:【M家杰的博客】概述模糊一张图片不难,各种算法也很多:高斯、均值、矩阵等等,但是在移动端需要考虑APP的使用体验,对于性能的要求还是很高的。所以在安卓中纯粹使用Java去实现肯定是最坑爹的做法,我们有另外两种方式可以选择:NDK or RenderscriptRendersc...

weixin_36330148的博客 1300

SPAD单光子雪崩二极管:从基础原理到前沿应用

本文深入解析SPAD单光子雪崩二极管的基础原理、硬件实现关键及核心性能参数,并探讨其在激光雷达、量子通信和生物医学成像等前沿领域的创新应用。SPAD凭借超高灵敏度和精确的时间分辨率,正在推动自动驾驶、量子技术和医学诊断等领域的革命性发展。

weixin_30335575的博客 661

电价预测的Transformer实战:从注意力机制到超长序列建模

本文深入探讨了Transformer模型在电价预测领域的实战应用,对比了其与LSTM在处理长序列依赖和误差累积问题上的优劣。文章详细解析了自注意力机制的原理,并提供了处理超长序列的位置编码方法、构建专用预测模型的完整PyTorch代码,以及防止信息泄露的关键技巧。通过实战对比,展示了Transformer在并行计算、长距离建模和预测精度上的显著优势,并分享了应对极端波动和提升模型效率的高级优化策略。

f6g7h8i9j的博客 540

android 图片高斯模糊处理方法

最近一直在找高斯模糊的一些处理方法,在网上找了yi'quan

TuiBianSoar的专栏 1026

W5500 MACRAW模式实战:在ESP32上抓取并解析原始以太网数据包

本文详细介绍了如何在ESP32开发板上使用W5500芯片的MACRAW模式捕获和解析原始以太网数据包。通过硬件连接指南、代码实现示例和协议解析技巧,帮助开发者深入理解网络通信底层机制,实现网络嗅探和自定义协议开发等高级应用。

weixin_42520573的博客 417

android设置背景图片模糊怎么办,Android - 高斯模糊处理头像作为背景图的两种高效便捷方法...

第一种是最简单方便的结合强大的Glide图片加载框架的使用(推荐)先来看看效果图吧!这种是使用头像作为背景模糊背景使用的,根据项目需求,单独背景什么的都行:个人中心头像背景图我的模块fragment界面Glide框架结合使用第一步添加下面依赖并同步compile 'com.github.bumptech.glide:glide:3.7.0'compile 'jp.wasabeef:glide-tr...

weixin_28736145的博客 1417

利用LTspice设计Pt100测温电路

是一种广泛使用的温度传感器,它属于(RTD, Resistance Temperature Detector)的类型,通常用于温度测量。在0°C时,的电阻值为100欧姆,且它的电阻值会随着温度的升高而升高。PT100热电阻温度阻值对应表)因此可以根据这一特性来检测出环境温度。

2301_77033628的博客 2412

ARM架构实战:在鲲鹏920服务器上用Debian12部署PVE虚拟化平台

本文详细介绍了在基于ARM架构的华为鲲鹏920服务器上,以Debian 12为底层系统,部署Proxmox VE(PVE)虚拟化平台的完整实战流程。文章重点解析了ARM64架构下PVE软件源的配置、内核安装的注意事项、部署后网络与存储的调优,并提供了针对ARM虚拟化环境的性能优化建议,为在国产化硬件上构建稳定高效的虚拟化环境提供了宝贵经验。

efc12345678的博客 780

【Android实战】Bitmap图片的截屏、模糊处理、传递、使用

1、截取无状态栏的当前屏幕图片,请参考takeScreenShot方法 2、使图片高斯模糊的方法请参考blurBitmap方法       注意:RenderScript是Android在API 11之后加入的,用于高效的图片处理,包括模糊、混合、矩阵卷积计算等 public class ScreenShotUtil { // 获取指定Activity的截屏,保存到png文件

s003603u的专栏 4017

RK3588开发笔记-ES8311音频芯片调试记录

本篇博客主要记录如何在RK3588平台试ES8311音频芯片的过程。这包括硬件连接、内核配置、驱动程序调试和测试步骤。通过以上步骤,我们成功在RK3588平台上调试了ES8311音频芯片。这包括硬件连接、内核配置、设备树配置、驱动加载以及音频测试。希望这篇调试记录能为其他开发者提供一些帮助。如果你有任何问题或建议,欢迎留言讨上调论。

flypig has a dream! 3161

2023-06-16 Android app 使用opencv 调用jni在图片上添加文字,对图片进行模糊处理,源码实例学习。

1.1 完整的测试代码路径如下。1、添加下面的代码就可以在图片上添加文字。1.3 app 运行效果。1、java 主要代码。3、效果图,可以看到图片已经模糊。方法一,不需要另外添加jni。1、java部分的主要代码。这个方法主要参考下面文章。2、jni 部分主要代码。

海月汐辰 1297

在 ABAP 环境中构建自定义健康监控指标:面向 SAP Cloud ALM 与 SAP Focused Run 的完整实践

本文介绍了在ABAP环境中开发自定义健康监控指标的方法。主要内容包括:1)标准监控指标的不足,如无法反映业务应用层面的问题;2)自定义监控架构,通过metric provider定义指标,由采集作业周期性获取数据并存储;3)核心实现技术,包括IF_GSM_API_PROVIDER接口和三个关键方法;4)指标从ABAP推送到SAP Cloud ALM/Focused Run的完整流程;5)开发实践步骤,从业务分析到具体实现。该方案可帮助团队监控业务关键指标,提升系统运维能力。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 262

【网络安全】零基础入门网络安全劝退指北

作为从16年接触网络安全的小白,谈谈零基础如何入门网络安全,有不对的地方,请多多指教。 这些年最后悔的事情莫过于没有把自己学习的东西积累下来形成一个知识体系。 后续我也会陆续的整理网络安全的相关学习资料及文章,与大家一起探讨学习。 如何入门 简单了解网络安全 网络安全就是指的确保网络系统中的数据不被别人破坏,而网安工程师就是涉及程序来维护网络安全。 网安方向有很多职位,比如安全产品工程师,安全分析师,数据恢复工程师,网络架构工程师,安全编程工程师,以及网络集成工程师等。 工作内容主要包括: 安全评测,风

互联网老辛 4583

android网络加载图片设置背景并且把图片设置模糊,请求图片,

这个项目是需要把一张图片设置成RecycleView的item的背景,并且需要把这个图片进行模糊处理来衬托其他控件显示数据的清晰,如果不设置成模糊,其他控件显示出来数据后会显得太乱,感觉不好,所以需要模糊处理,模糊处理的代码我也是问的度娘,代码如下@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1) public Bitmap blurBitmap(

wangchuang8865的博客 1918

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Android中为网络图片设置高斯模糊效果

参考了这篇文章:               Android:简单靠谱的动态高斯模糊效果 写一个方法,用来对Bitmap进行高斯模糊: public static Bitmap blurBitmap(Bitmap bitmap ,Context context){ //Let's create an empty bitmap with the same size of the b

凌空之鹤 2354

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

java 模糊图片_记录三种实现图片模糊的方法

前言最近给自己挖了几个坑,准备填一下。现在来填一下第一个坑:图片模糊。关于图片模糊的方法有很多,比如:Open CV 的各种图片处理、Android 支持的高性能密集型任务执行框架 RenderScript、Java 或者 C/C++ 的算法实现图片模糊处理。本篇文章将包含以下内容:RenderScript 简介与图片模糊的实现Java / C++ 算法实现图片模糊处理一个简单的动态模糊实现总结至...

weixin_32513585的博客 2200
上一篇: ViewPager禁止滑动的问题
下一篇: ViewPager实现Gallery画廊效果——仿慕课网app-求职路线计划-效果(二)
Z漫步
博客等级 码龄12年 42粉丝 80原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值