本文的最后提供了完整的Android工程下载,图像处理部分主要采用JNI,算法使用C实现,因为在开发过程中发现使用Java来进行数值处理时,速度绝对是不堪忍受的。现在代码中依然保留了一些Java的滤镜算法接口,即滤镜名称如果分为形如”浮雕”和”浮雕J”的,则前者使用Java实现,后者是C实现,各位可以比较一下两种实现的性能,也能对JNI的高性能有一个直观的认识。

程序提供了一些简单的滤镜效果,运行效果如下:

1 柔化算法

柔化算法的效果是让图片的每一个点与周围点的颜色更平滑,算法原理很简单,就是针对每一个像素,将其颜色值置为周围8个点加上自身的RGB的平均值。不过这样处理后的效果不是很明显,可以采用高斯模糊算法,能获取更好的效果。

原图如下:

采用平均值法的柔化算法处理结果如下:

2 光照

有时需要在照片中增加一个光源这样的效果,如何实现呢?

首先我们设定一个光源中心坐标和光照强度,然后以此光源和图片边缘的最短距离为半径,依次为每个点的RGB增加一个同样的值,当然,图片上的点距离光源中心越远,则增加的颜色值越小,通过这样的方法,就能够实现光照的效果了。

原图如下:

光照处理效果如下:

3 放大镜

前面介绍过通过坐标变换矩阵来缩放、旋转图片的方法,这里通过直接操作图像数据来实现图像的局部放大功能。

假如我们定义放大镜的坐标为(CenterX,CenterY),半径为Radius,而放大倍数为M = 2,那么其实就是将原图中的坐标为(CenterX,CenterY)、半径为Radius/M的区域的图像放大到放大镜覆盖的区域即可,算法其实很简单,对图片上的每一个点(X,Y),求其与(CenterX,CenterY)的距离Distance,若Distance <>

处理效果如下:

代码如下:

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758jintArray Java_com_spore_meitu_jni_ImageUtilEngine_toFangdajing (JNIEnv* env,jobject thiz, jintArray buf, jint width, jint height,jint centerX, jint centerY, jint radius, jfloat multiple){jint * cbuf;cbuf = (*env)->GetIntArrayElements(env, buf, 0); int newSize = width * height;jint rbuf[newSize]; // 新图像像素值 float xishu = multiple;int real_radius = (int)(radius / xishu); int i = 0, j = 0;for (i = 0; i width; i++){for (j = 0; j height; j++){int curr_color = cbuf[j * width + i]; int pixR = red(curr_color);int pixG = green(curr_color);int pixB = blue(curr_color);int pixA = alpha(curr_color); int newR = pixR;int newG = pixG;int newB = pixB;int newA = pixA; int distance = (int) ((centerX - i) * (centerX - i) + (centerY - j) * (centerY - j));if (distance radius * radius){// 图像放大效果int src_x = (int)((float)(i - centerX) / xishu + centerX);int src_y = (int)((float)(j - centerY) / xishu + centerY); int src_color = cbuf[src_y * width + src_x];newR = red(src_color);newG = green(src_color);newB = blue(src_color);newA = alpha(src_color);} newR = min(255, max(0, newR));newG = min(255, max(0, newG));newB = min(255, max(0, newB));newA = min(255, max(0, newA)); int modif_color = ARGB(newA, newR, newG, newB);rbuf[j * width + i] = modif_color;}} jintArray result = (*env)->NewIntArray(env, newSize);(*env)->SetIntArrayRegion(env, result, 0, newSize, rbuf);(*env)->ReleaseIntArrayElements(env, buf, cbuf, 0);return result;}

4 哈哈镜

哈哈镜就是各种千奇百怪的扭曲效果,其实上面的放大镜不是真正的放大镜效果,大家都知道使用凹凸镜时看到的图像其实是有扭曲效果的,因为放大镜并不是一个平滑的镜面,而是越靠经中心的点放大倍数越大,靠近边缘的点放大倍数越小,这样就形成了扭曲的效果,这个效果和哈哈镜比较类似。

于是,我们可以改进上面的放大镜算法来实现一个简单的哈哈镜的扭曲效果,注意放大算法中这两行代码:

12int src_x = (int)((float)(i - centerX) / xishu + centerX);int src_y = (int)((float)(j - centerY) / xishu + centerY);

这就是计算新的颜色值与原图中像素对应坐标的,从这里可以看出,这种方式是简单的根据放大系数等比例的缩放坐标值,即Y = X / M,由于是一元的关系,因此只能实现平滑的缩放的效果,我们应该使用一种二元或者其他的计算方法,使得放大系数与距离成反比。

这是我想到的一种比较简单的方法,是通过抛物线的二项表达式推导出来的,当然,其实效果也不是那里理想,不过好歹能看出扭曲的效果了。不得不感慨当年高数应该好好学习的啊!

将上面的代码替换成下面:

1234567// 放大镜的凹凸效果int src_x = (int) ((float) (i - centerX) / xishu);int src_y = (int) ((float) (j - centerY) / xishu);src_x = (int)(src_x * (sqrt(distance) / real_radius));src_y = (int)(src_y * (sqrt(distance) / real_radius));src_x = src_x + centerX;src_y = src_y + centerY;

现在处理后的效果如下:

下载代码,请猛击此处。

android图片凹凸效果,图像滤镜处理算法:柔化、光照、放大镜、哈哈镜相关推荐

  1. photoshop图像滤镜——素描算法(含matlab与C代码)

    二.photoshop图像滤镜--素描算法 素描的算法,网络上有多种,但是效果并不是特别理想.熟悉photoshop的朋友都知道,把彩色图片打造成素描的效果仅仅需要几步操作:1.去色:2.复制去色图层 ...

  2. matlab实现photoshop,photoshop图像滤镜——素描算法(含matlab代码)

    二.photoshop图像滤镜--素描算法 素描的算法,网络上有多种,但是效果并不是特别理想.熟悉photoshop的朋友都知道,把彩色图片打造成素描的效果仅仅需要几步操作:1.去色:2.复制去色图层 ...

  3. photoshop图像滤镜——素描算法(含matlab代码)

    二.photoshop图像滤镜--素描算法 素描的算法,网络上有多种,但是效果并不是特别理想.熟悉photoshop的朋友都知道,把彩色图片打造成素描的效果仅仅需要几步操作:1.去色:2.复制去色图层 ...

  4. matlab将图像油画,photoshop图像滤镜——油画算法(含matlab与C代码)

    三.photoshop图像滤镜--油画算法 有关油画的算法,我在各类网站包括数据库查询了许久,只了解到这么一种:用当前点四周一定范围内任意一点的颜色来替代当前点颜色,最常用的是随机的采用相邻点进行替代 ...

  5. matlab 浮雕算法,photoshop图像滤镜——浮雕算法(含matlab代码)

    一.photoshop图像滤镜--浮雕算法 浮雕的算法是对图像的每一个点进行卷积处理,采用的矩阵如下 [100:00 0:00-1]: 假设原图像为X,处理后的图像为Y ,也就是说,对于坐标为(i,j ...

  6. 图像滤镜处理算法:柔化、光照、放大镜、哈哈镜

    转载自:http://www.icodelogic.com/?p=588 本文的最后提供了完整的Android工程下载,图像处理部分主要采用JNI,算法使用C实现,因为在开发过程中发现使用Java来进 ...

  7. 图像滤镜处理算法:灰度、黑白、底片、浮雕

    最近手机端图片类的应用很火,比如刚被Facebook收购的Instagram,还有以前ipad上很有意思的一款应用Photo Booth.图片类应用,免不了对图片的处理,常见的滤镜效果,如灰度.底片. ...

  8. Android 图片陀螺仪效果/VR效果-仿链家、贝壳

    图片陀螺仪效果: 呃呃,由于博客不能上传视频,只能添加视频链接,我就截张图吧,大家可以下载链家app看下房源详情的首图效果: 实现如下: 加载图片用的Glide: compile 'com.githu ...

  9. Android图片背景朦胧效果,android 图片的模糊化处理,效果类似超级课程表的“我的中心里头像背景,看起来很炫...

    在很多APP里,个人中心是必不可少的,这样就少不了点击头像换头像,设置专属于自己的头像,设置自己的头像后,将自己的头像设为背景,然后模糊化处理成背景图片,这样的效果看起来很炫. 1.将图片转换为Dra ...

最新文章

  1. 【Android 逆向】Android 逆向通用工具开发 ( Android 端远程命令工具 | Android 端可执行程序的 main 函数操作 | TCP 协议服务器建立 | 接收客户端数据 )
  2. java messagebox 关闭_wince/WinForm下实现一个自动关闭的MessageBox
  3. Linux操作基础(十七)之Systemd入门教程(二)实战篇
  4. 反转链表python
  5. 查理.芒格,谈投资的秘密
  6. 【BZOJ】1001: [BeiJing2006]狼抓兔子 Dinic算法求解平面图对偶图-最小割
  7. lm358 pdf应用电路资料及引脚图
  8. 服务器系统如何卸载IE,如何卸载ie浏览器,我来教您如何卸载ie浏览器的步骤
  9. 生信过程中的各种文件格式
  10. 【xinput1_3.dll下载】xinput1_3.dll丢失怎么修复win10
  11. Stm32中英文手册官网免费
  12. 【论文笔记】DR-TANet: Dynamic Receptive Temporal Attention Network for Street Scene Change Detection
  13. 熬了整整30天,搭建kafka服务器centos8
  14. 自媒体各大平台收益对比_各大自媒体平台收益排名?
  15. 信息时代的管理信息系统
  16. 毕业设计Spring boot问题记录(后端三):java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax;
  17. 流量控制组件, 技术选型:Sentinel vs Hystrix
  18. Python建立线性回归模型进行房价预测
  19. THESEUS-FE | 电动汽车热管理
  20. python+django电子招标投标管理系统pycharm项目

热门文章

  1. 计算机技术与课堂教学整合,信息技术与课程整合之我见
  2. [MRCTF2020]天干地支+甲子
  3. c语言编程新思路知道答案,C语言编程新思路知道答案公众号
  4. 好看的黑色响应式滚动式动态背景个人导航HTML源码
  5. 有可以提醒自己上下班打卡的手机便签软件吗?
  6. 【01:转自知乎:关于 openSUSE 】
  7. 服务器性能管理系统,服务器系统性能管理是什么
  8. 计算机老师新年贺卡祝福语,2015献给老师的新年贺卡祝福语
  9. 一篇文章搞懂MongoDB数据库
  10. 11款惊艳的HTML5粒子动画特效