毛玻璃效果:高斯模糊效果:

//高斯模糊,毛玻璃
//低于Android4.2可以用Java原生代码实现。但是效率会低不少:这完全是一种妥协的方式,不推荐
public Bitmap fastblur(Context context, Bitmap sentBitmap, int radius) {Bitmap 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 temp = 256 * divsum;int dv[] = new int[temp];for (i = 0; i < temp; 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++) {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 API17private 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();
}
//api在16以上,可以使用系统提供的方法直接处理图片
if (VERSION.SDK_INT > 16) {Bitmap bitmap = sentBitmap.copy(sentBitmap.getConfig(), true);final RenderScript rs = RenderScript.create(context);final Allocation input = Allocation.createFromBitmap(rs, sentBitmap, Allocation.MipmapControl.MIPMAP_NONE,Allocation.USAGE_SCRIPT);final Allocation output = Allocation.createTyped(rs, input.getType());final ScriptIntrinsicBlur script = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs));script.setRadius(radius /* e.g. 3.f */);script.setInput(input);script.forEach(output);output.copyTo(bitmap);return bitmap;
}
//C 语言实现
static int* StackBlur(int* pix, int w, int h, int radius) {int wm = w - 1;int hm = h - 1;int wh = w * h;int div = radius + radius + 1;int *r = (int *)malloc(wh * sizeof(int));int *g = (int *)malloc(wh * sizeof(int));int *b = (int *)malloc(wh * sizeof(int));int rsum, gsum, bsum, x, y, i, p, yp, yi, yw;int *vmin = (int *)malloc(MAX(w,h) * sizeof(int));int divsum = (div + 1) >> 1;divsum *= divsum;int *dv = (int *)malloc(256 * divsum * sizeof(int));for (i = 0; i < 256 * divsum; i++) {dv[i] = (i / divsum);}yw = yi = 0;int(*stack)[3] = (int(*)[3])malloc(div * 3 * sizeof(int));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 + (MIN(wm, MAX(i, 0)))];sir = stack[i + radius];sir[0] = (p & 0xff0000) >> 16;sir[1] = (p & 0x00ff00) >> 8;sir[2] = (p & 0x0000ff);rbs = r1 - 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] = 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 = MAX(0, yp) + x;sir = stack[i + radius];sir[0] = r[yi];sir[1] = g[yi];sir[2] = b[yi];rbs = r1 - 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] = 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;}}free(r);free(g);free(b);free(vmin);free(dv);free(stack);return(pix);
}
//高斯模糊
public static void gaussBlur(int[] data, int width, int height, int radius,float sigma) {float pa = (float) (1 / (Math.sqrt(2 * Math.PI) * sigma));float pb = -1.0f / (2 * sigma * sigma);// generate the Gauss Matrixfloat[] gaussMatrix = new float[radius * 2 + 1];float gaussSum = 0f;for (int i = 0, x = -radius; x <= radius; ++x, ++i) {float g = (float) (pa * Math.exp(pb * x * x));gaussMatrix[i] = g;gaussSum += g;}for (int i = 0, length = gaussMatrix.length; i < length; ++i) {gaussMatrix[i] /= gaussSum;}// x directionfor (int y = 0; y < height; ++y) {for (int x = 0; x < width; ++x) {float r = 0, g = 0, b = 0;gaussSum = 0;for (int j = -radius; j <= radius; ++j) {int k = x + j;if (k >= 0 && k < width) {int index = y * width + k;int color = data[index];int cr = (color & 0x00ff0000) >> 16;int cg = (color & 0x0000ff00) >> 8;int cb = (color & 0x000000ff);r += cr * gaussMatrix[j + radius];g += cg * gaussMatrix[j + radius];b += cb * gaussMatrix[j + radius];gaussSum += gaussMatrix[j + radius];}}int index = y * width + x;int cr = (int) (r / gaussSum);int cg = (int) (g / gaussSum);int cb = (int) (b / gaussSum);data[index] = cr << 16 | cg << 8 | cb | 0xff000000;}}// y directionfor (int x = 0; x < width; ++x) {for (int y = 0; y < height; ++y) {float r = 0, g = 0, b = 0;gaussSum = 0;for (int j = -radius; j <= radius; ++j) {int k = y + j;if (k >= 0 && k < height) {int index = k * width + x;int color = data[index];int cr = (color & 0x00ff0000) >> 16;int cg = (color & 0x0000ff00) >> 8;int cb = (color & 0x000000ff);r += cr * gaussMatrix[j + radius];g += cg * gaussMatrix[j + radius];b += cb * gaussMatrix[j + radius];gaussSum += gaussMatrix[j + radius];}}int index = y * width + x;int cr = (int) (r / gaussSum);int cg = (int) (g / gaussSum);int cb = (int) (b / gaussSum);data[index] = cr << 16 | cg << 8 | cb | 0xff000000;}}
}

旧时光效果:

/**
* 旧时光特效
*
* @param bmp
*            原图片
* @return 旧时光特效图片
*/
public static Bitmap oldTimeFilter (Bitmap bmp)
{int width = bmp.getWidth();int height = bmp.getHeight();Bitmap bitmap = Bitmap.createBitmap (width, height, Bitmap.Config.RGB_565);int pixColor = 0;int pixR = 0;int pixG = 0;int pixB = 0;int newR = 0;int newG = 0;int newB = 0;int[] pixels = new int[width * height];bmp.getPixels (pixels, 0, width, 0, 0, width, height);for (int i = 0; i < height; i++){for (int k = 0k < width; k++){pixColor = pixels[width * i + k];pixR = Color.red (pixColor);pixG = Color.green (pixColor);pixB = Color.blue (pixColor);newR = (int) (0.393 * pixR + 0.769 * pixG + 0.189 * pixB);newG = (int) (0.349 * pixR + 0.686 * pixG + 0.168 * pixB);newB = (int) (0.272 * pixR + 0.534 * pixG + 0.131 * pixB);int newColor = Color.argb (255, newR > 255 ? 255 : newR, newG > 255 ? 255 : newG, newB > 255 ? 255 : newB);pixels[width * i + k] = newColor;}}bitmap.setPixels (pixels, 0, width, 0, 0, width, height);return bitmap;
}

暖意效果:

/**
* 暖意特效
*
* @param bmp
*            原图片
* @param centerX
*            光源横坐标
* @param centerY
*            光源纵坐标
* @return 暖意特效图片
*/
public static Bitmap warmthFilter (Bitmap bmp, int centerX, int centerY)
{final int width = bmp.getWidth();final int height = bmp.getHeight();Bitmap bitmap = Bitmap.createBitmap (width, height, Bitmap.Config.RGB_565);int pixR = 0;int pixG = 0;int pixB = 0;int pixColor = 0;int newR = 0;int newG = 0;int newB = 0;int radius = Math.min (centerX, centerY);final float strength = 150F;// 光照强度 100~150int[] pixels = new int[width * height];bmp.getPixels (pixels, 0, width, 0, 0, width, height);int pos = 0;for (int i = 1, length = height - 1; i < length; i++){for (int k = 1, len = width - 1; k < len; k++){pos = i * width + k;pixColor = pixels[pos];pixR = Color.red (pixColor);pixG = Color.green (pixColor);pixB = Color.blue (pixColor);newR = pixR;newG = pixG;newB = pixB;// 计算当前点到光照中心的距离,平面座标系中求两点之间的距离int distance = (int) (Math.pow ( (centerY - i), 2) + Math.pow (centerX - k, 2) );if (distance < radius * radius){// 按照距离大小计算增加的光照值int result = (int) (strength * (1.0 - Math.sqrt (distance) / radius) );newR = pixR + result;newG = pixG + result;newB = pixB + result;}newR = Math.min (255, Math.max (0, newR) );newG = Math.min (255, Math.max (0, newG) );newB = Math.min (255, Math.max (0, newB) );pixels[pos] = Color.argb (255, newR, newG, newB);}}bitmap.setPixels (pixels, 0, width, 0, 0, width, height);return bitmap;
}

lomo效果

/**
* LOMO特效
*
* @param bitmap
*            原图片
* @return LOMO特效图片
*/
public static Bitmap lomoFilter (Bitmap bitmap)
{int width = bitmap.getWidth();int height = bitmap.getHeight();int dst[] = new int[width * height];bitmap.getPixels (dst, 0, width, 0, 0, width, height);int ratio = width > height ? height * 32768 / width : width * 32768 / height;int cx = width >> 1;int cy = height >> 1;int max = cx * cx + cy * cy;int min = (int) (max * (1 - 0.8f) );int diff = max - min;int ri, gi, bi;int dx, dy, distSq, v;int R, G, B;int value;int pos, pixColor;int newR, newG, newB;for (int y = 0; y < height; y++){for (int x = 0; x < width; x++){pos = y * width + x;pixColor = dst[pos];R = Color.red (pixColor);G = Color.green (pixColor);B = Color.blue (pixColor);value = R < 128 ? R : 256 - R;newR = (value * value * value) / 64 / 256;newR = (R < 128 ? newR : 255 - newR);value = G < 128 ? G : 256 - G;newG = (value * value) / 128;newG = (G < 128 ? newG : 255 - newG);newB = B / 2 + 0x25;// ==========边缘黑暗==============//dx = cx - x;dy = cy - y;if (width > height){dx = (dx * ratio) >> 15;}else{dy = (dy * ratio) >> 15;}distSq = dx * dx + dy * dy;if (distSq > min){v = ( (max - distSq) << 8) / diff;v *= v;ri = newR * v >> 16;gi = newG * v >> 16;bi = newB * v >> 16;newR = ri > 255 ? 255 : (ri < 0 ? 0 : ri);newG = gi > 255 ? 255 : (gi < 0? 0 : gi);newB = bi > 255 ? 255 : (bi < 0 ? 0 : bi);}// ==========边缘黑暗end==============//dst[pos] = Color.rgb (newR, newG, newB);}}Bitmap acrossFlushBitmap = Bitmap.createBitmap (width, height, Bitmap.Config.RGB_565);acrossFlushBitmap.setPixels (dst, 0, width, 0, 0, width, height);return acrossFlushBitmap;
}
高斯模糊效果:

图片处理的几种算法(毛玻璃效果,高斯模糊效果,旧时光效果,lomo效果,暖意效果)相关推荐

  1. 相似图片搜索的三种算法

    相似图片搜索的三种算法 想必大家都用google或baidu的识图功能,上面就是我搜索冠希哥一幅图片的结果,这种搜索的核心算法有三种,都是利用信息指纹比较,这些算法都很易懂,下面分别介绍一下: 一.平 ...

  2. python OpenCV 图片相似度 5种算法

    原始两张图片: 代码运行结果如下. 5种算法 值哈希算法.差值哈希算法和感知哈希算法都是值越小,相似度越高,取值为0-64,即汉明距离中,64位的hash值有多少不同. 三直方图和单通道直方图的值为0 ...

  3. js实现图片虚化_StackBlur.js - 实现Canvas高斯模糊效果

    越来越多的app在背景图中使用高斯模糊效果,如yahoo天气,感觉效果做得很炫.现在使用StackBlur.js在网页上也可以对Canvas实现高斯模糊效果,运行相当流畅,画面一点不卡. 引入资源 在 ...

  4. ML之SVM:利用SVM算法对手写数字图片识别数据集(PCA降维处理)进行预测并评估模型(两种算法)性能

    ML之SVM:利用SVM算法对手写数字图片识别数据集(PCA降维处理)进行预测并评估模型(两种算法)性能 目录 输出结果 设计思路 核心代码 输出结果 设计思路 核心代码 estimator = PC ...

  5. DL之NN:NN算法(本地数据集50000张训练集图片)进阶优化之三种参数改进,进一步提高手写数字图片识别的准确率

    DL之NN:NN算法(本地数据集50000张训练集图片)进阶优化之三种参数改进,进一步提高手写数字图片识别的准确率 导读 上一篇文章,比较了三种算法实现对手写数字识别,其中,SVM和神经网络算法表现非 ...

  6. DL之NN/Average_Darkness/SVM:手写数字图片识别(本地数据集50000训练集+数据集加4倍)比较3种算法Average_Darkness、SVM、NN各自的准确率

    DL之NN/Average_Darkness/SVM:手写数字图片识别(本地数据集50000训练集+数据集加4倍)比较3种算法Average_Darkness.SVM.NN各自的准确率 目录 数据集下 ...

  7. 【python 以图搜图】三种图片相似度计算融合算法

    目标:在一个文件夹找出相似度较高的图片,达到以图搜图的目的. 我找了十组,都是高度相似的图片. 核心算法: 1.分别自定义三种计算图片相似度算法,计算图片相似度算法ORB算法,以及局部敏感哈希phas ...

  8. 一种快速毛玻璃虚化效果实现

    一种快速毛玻璃虚化效果实现  开发进阶  AndroidChina  1个月前 (05-02)  763浏览  0评论 在iOS设备上我们随处可见毛玻璃效果,而且最近越来越多的场合应用到了这种美观的虚 ...

  9. 图片插值数据_结合PS用这招来增强ArcGIS插值图出图效果

    1 概述 在一些科研领域,经常会遇到使用插值的方式进行处理,并生成最终的插值图.插值图在ArcGIS里面非常容易生成,只要具备了采用点数据,通过ArcToolBox里面的插值的工具可以直接生成最终的插 ...

  10. 文本分类的14种算法

    向AI转型的程序员都关注了这个号???????????? 机器学习AI算法工程   公众号:datayx 之前介绍了14种文本分类中的常用算法,包括8种传统算法:k临近.决策树.多层感知器.朴素贝叶斯 ...

最新文章

  1. 将行政区域导入SQL SERVER
  2. 使用AD5933测量电子器件复阻抗
  3. android流量监控步骤_Android流量网络监控设计(超级实用版).doc
  4. 解决pip使用异常No module named 'pip'
  5. css 样式面板,关于 CSS 样式面板
  6. mysql5.6.39编译安装_源码编译安装MySQL-5.6/mysql-5.6.39------踩了无数坑,重装了十几次服务器才会的,不容易啊!...
  7. mysql5.6数据库执行mysqldump备份,报1862密码过期的处理方法。
  8. 旧项目如何切换到Entity Framework Code First
  9. 关于引擎代码从Delphi 2007 升级至Delphi 10.1的一些历程
  10. html 预加载图片,实现网页图片预加载的几个方法
  11. 锐捷ac怎么发现局域网ap_锐捷APAC初始化登录管理说明及热点问题
  12. 前端遇到GET https://XXXX net::ERR_HTTP2_PROTOCOL_ERROR 200问题的解决办法
  13. Fashion MNIST进行分类
  14. 200元左右的蓝牙耳机推荐,2021蓝牙耳机排行榜10强
  15. Mybatis最入门---分页查询(逻辑分页与SQL语句分页)
  16. 华硕笔记本k555拆机图解_华硕(ASUS)K54HR笔记本拆机清灰图解
  17. 离子引擎驱动的无声飞机原型成功试飞;华为测试谷歌 Fuchsia OS
  18. 转:德鲁克: 每个人都应成为自己的“首席执行官”
  19. Visualization of Detail Point Set by Local Algebraic Sphere Fitting
  20. houdini instance

热门文章

  1. 网络应用 1.计算机网络应用体系结构 2.网络应用通信基本原理 3.域名系统(DNS)4.万维网应用 5.Internet电子邮件 6.FTP 7.P2P应用 8.Socket编程基础
  2. 怎么用电脑把mp4格式转换成mp3格式
  3. Vuepress 如何引入百度统计和谷歌统计
  4. 网络安全常用的主流数据库(DBMS)✍
  5. python PIL使用记录
  6. 【ORACLE】详解oracle数据库UTL_ENCODE包各个函数的模拟算法
  7. php-ftm,关于KEA128中FTM0/1的问题
  8. 金融理财产品后台原型|Axure原型
  9. 20dbm是多少mw
  10. 读书之二 --《程序员修炼之道》