android 网络图片工具类,分享一个Android图片模糊的工具类
图片模糊,试过很多工具什么的,还是这个类比较好,直接用就好了
使用方法:
imageView.setImageBitmap(BlurUtil.doBlur(drawable,10,15));
package custom;
import android.graphics.Bitmap;
import android.media.ThumbnailUtils;
/**
* 图片虚化辅助类
* Created by jay on 11/7/15.
*/
public class BlurUtil {
private static final String TAG = BlurUtil.class.getSimpleName();
/**
* 对图片进行毛玻璃化
* @param sentBitmap 位图
* @param radius 虚化程度
* @param canReuseInBitmap 是否重用
* @return 位图
*/
public static Bitmap doBlur(Bitmap sentBitmap, int radius, boolean canReuseInBitmap) {
// Stack Blur v1.0 from
// http://www.quasimondo.com/StackBlurForCanvas/StackBlurDemo.html
//
// Java Author: Mario Klingemann
// http://incubator.quasimondo.com
// created Feburary 29, 2004
// Android port : Yahel Bouaziz
// http://www.kayenko.com
// ported april 5th, 2012
// This is a compromise between Gaussian Blur and Box blur
// It creates much better looking blurs than Box Blur, but is
// 7x faster than my Gaussian Blur implementation.
//
// I called it Stack Blur because this describes best how this
// filter works internally: it creates a kind of moving stack
// of colors whilst scanning through the image. Thereby it
// just has to add one new block of color to the right side
// of the stack and remove the leftmost color. The remaining
// colors on the topmost layer of the stack are either added on
// or reduced by one, depending on if they are on the right or
// on the left side of the stack.
//
// If you are using this algorithm in your code please add
// the following line:
//
// Stack Blur Algorithm by Mario Klingemann
Bitmap bitmap;
if (canReuseInBitmap) {
bitmap = sentBitmap;
} else {
bitmap = sentBitmap.copy(sentBitmap.getConfig(), true);
}
if (radius < 1) {
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);
// print("虚化后 ",bitmap);
return (bitmap);
}
/**
* 对图片进行毛玻璃化
* @param originBitmap 位图
* @param scaleRatio 缩放比率
* @param blurRadius 毛玻璃化比率,虚化程度
* @return 位图
*/
public static Bitmap doBlur(Bitmap originBitmap, int scaleRatio, int blurRadius){
// print("原图::",originBitmap);
Bitmap scaledBitmap = Bitmap.createScaledBitmap(originBitmap,
originBitmap.getWidth() / scaleRatio,
originBitmap.getHeight() / scaleRatio,
false);
Bitmap blurBitmap = doBlur(scaledBitmap, blurRadius, false);
scaledBitmap.recycle();
return blurBitmap;
}
// private static void print(String tag, Bitmap originBitmap) {
// StringBuilder sb = new StringBuilder(tag);
// sb.append( String.format(" width=%s,",originBitmap.getWidth()));
// sb.append( String.format(" height=%s,",originBitmap.getHeight()));
// Log.i(TAG,sb.toString());
// }
/**
* 对图片进行 毛玻璃化,虚化
* @param originBitmap 位图
* @param width 缩放后的期望宽度
* @param height 缩放后的期望高度
* @param blurRadius 虚化程度
* @return 位图
*/
public static Bitmap doBlur(Bitmap originBitmap,int width,int height,int blurRadius){
Bitmap thumbnail = ThumbnailUtils.extractThumbnail(originBitmap, width, height);
Bitmap blurBitmap = doBlur(thumbnail, blurRadius, true);
thumbnail.recycle();
return blurBitmap;
}
}
android 网络图片工具类,分享一个Android图片模糊的工具类相关推荐
- 合并工具_分享一个SM to HISM合并工具
UE4提供了非常高效的优化工具,比如多物体合并,MergeActor合并SM为ISM,但是ISM和HISM有一个比较关键的区别就是对剔除的支持,ISM的剔除针对整个SM编组,HISM可针对编组内的单个 ...
- android 最新 九宫格,Android开发中怎么显示一个九宫格图片
Android开发中怎么显示一个九宫格图片 发布时间:2020-11-21 15:09:33 来源:亿速云 阅读:86 作者:Leah 本篇文章给大家分享的是有关Android开发中怎么显示一个九宫格 ...
- 分享一个Android源码在线阅读的网址
分享一个Android源码在线阅读的网址 :http://androidxref.com/4.2.2_r1/
- 分享一个发送http请求的工具类
分享一个发送http请求的工具类 maven依赖只需要导入一个 <dependencies><dependency><groupId>commons-httpcli ...
- 分享一个日文图片文字识别在线的方法
对于一些从事贸易的朋友,尤其是一些从事国际贸易的朋友,往往需要整理很多外语资料.最近就有个小伙伴说他刚从事与一些日本企业合作,刚开始每天都需要整理大量的日文信息,但人工整理效率太低,但是如果有可以识别 ...
- 《教我兄弟学Android逆向01 编写第一个Android程序》
前言 之所以准备写这一系列逆向的教程是因为有一些同学私信我说自己想学习Android逆向但是不知道怎么去学习 包括自己身边的一些计算机专业的同学 在大学里面老师讲的那些东西要么是自己不感兴趣 要么是自 ...
- 《教我兄弟学Android逆向03 破解第一个Android游戏 》
上一篇 <教我兄弟学Android逆向02 破解第一个Android程序 >我带着你破解了我们自己编的一个小程序 里面我分析并讲解的一些smali语法你都记住了 给你布置的课后作业你发 ...
- 分享一个android手机开不了机的问题
前段时间开发了一个小屏的功能(效果图如下:),果了一段时间,测试的人员说我们的手机有时开机不了:一直停止在开机的界面.刚开始都不知道什么原因.查了各种代码都没有发现问题.到后来感觉问题越来越严重了. ...
- android 禁用dlsym_[原创] 分享一个最近新撸增强版的绕过Android/iOS的dlopen/dlsym限制的dlfunctions库...
简介 byOpen是一个绕过移动端系统限制的dlopen库. 支持特性 Android 支持App中加载和使用Android系统库接口(即使maps中还没有被加载也支持). Android 7以上dl ...
最新文章
- 海门工业机器人_海门凹凸模压标机推荐-无锡胜宝机电
- bzoj3600 没有人的算术
- 安全预警:勒索软件正成为制马人的新方向
- R语言与总体比例的置信区间
- C# 参考之方法参数关键字:params、ref及out
- 秋风秋雨愁煞人:寒宵独坐心如捣
- C语言库函数大全及应用实例三
- 2019年第四次课程设计实验报告
- 数据库索引:位图索引
- 超几何分布检验(hypergeometric test)与费歇尔精确检验(fisher's exact test)
- 电机驱动芯片效果对比
- FZOJ P2109 【卡德加的兔子】
- 【隐形的翅膀】基于钉钉工作流的人事评价信息采集案例(2):钉钉智能表单、OA审批、自动任务功能对比
- TCP Congestion性能测试分析
- Hyper-V 配置静态 IP
- 消费金融进入“第二赛段”,突围关键是什么?
- 数据结构-栈(栈的C语言实现)
- map与sync.Map
- Kali下面装goldendict词典的安装和添加词典文件
- RK3399平台开发系列讲解(内核驱动外设篇)6.19、摄像头OV4689模组驱动代码分析
热门文章
- python 一张图画多条线_Python画多条线在一个图里
- C语言(二):数据类型
- Python自动化-APPium原理解析与实际测试案例分享
- UVA11134 传说中的车 Fabled Rooks
- 跳转饿了么小程序、跳转美团小程序、获取小程序路径、小程序生成小程序码不能选择第三方小程序、领红包功能开发(附源码)
- 两个地理坐标距离计算
- Autocad2015点开闪退问题,线段等分
- The application was unable to start correctly (0xc000007b)的勉强解决方案
- 1788. 牛为什么过马路
- 常用图形渲染API简介