前言

  • 这里主要还是学习ndk开发,这个对比度的算法,原理上也不是很清晰,通过本篇文章,主要了解到ndk简单开发的流程,图片处理的基本原理。
  • 学习来源:爱奇艺视频搜索:Android开发NDK图片处理,有个一个半小时的视频的,他的开发环境是eclipse。目前我用过的环境是android studio2.2的,开发环境的搭建可以看我之前的文章。

程序步骤

  • AS2.2创建一个支持C++的工程,自动生成了Jni文件夹和一些配置文件。
  • 先看项目的配置文件,build.gradle中:
 externalNativeBuild {cmake {path "CMakeLists.txt"}}
  • 这里是要执行这个cmake的文件,再看CMakeLists.txt
add_library( # Sets the name of the library.native-lib# Sets the library as a shared library.SHARED# Provides a relative path to your source file(s).# Associated headers in the same location as their source# file are automatically included.src/main/cpp/native-lib.cppsrc/main/cpp/ndk_handle_pics.cpp )
  • 这里加载一个名为 native-lib 的动态库,文件中的内容有src/main/cpp/native-lib.cpp, src/main/cpp/ndk_handle_pics.cpp
    这两个文件。
target_link_libraries( # Specifies the target library.native-lib# Links the target library to the log library# included in the NDK.${log-lib} )
  • 这里 就是将 log-lib 连接到我们的 native-lib动态库中

  • 图片是我随便在网上找到的一张图片的,图片里面的处理前跟处理后跟我这里的处理没有什么关系,这里搜索磨皮效果的时候找到的图片,这是别人的对比图。我先上我没处理过之前的图片的

  • 以上主要是介绍配置文件的作用,核心代码如下:

  • 这里是用java来处理图片的代码
                  long start_time = System.currentTimeMillis();//核心:获取到bitmap的ARGB,来用它做 对比度 的处理//定义一个亮度和对比度 这个对比度的算法是别人来做的float brightness = 0.2f;float constract = 0.2f;int width = mBitmap.getWidth();int height = mBitmap.getHeight();Bitmap bitmap = Bitmap.createBitmap(width , height , Bitmap.Config.RGB_565);//开始来处理int a , r , g , b ;//调黑的亮度int bab  = (int) (255 * brightness);//对比度float ca = 1.0f + constract;//再调高一点而已ca *= ca;int cab = (int) (ca * 65536) + 1 ;//开始每一个点来做处理的for(int x = 0 ; x < width ; x++){for(int y = 0 ; y < height ; y++){//获取到每个像素点的颜色值int color = mBitmap.getPixel(x, y);a = Color.alpha(color);r = Color.red(color);g = Color.green(color);b = Color.blue(color);//然后减去一个亮度int ri = r - bab;int gi = g - bab;int bi = b - bab;//重新进行一下赋值r = (ri > 255)?255:(ri < 0 ? 0 : ri);b = (bi > 255)?255:(bi < 0 ? 0 : bi);g = (gi > 255)?255:(gi < 0 ? 0 : gi);//对比变化度,主要看大于还是小于0ri = r - 128;gi = g - 128;bi = b - 128;//ri = (ri * cab)/65536 等价于 ri = (ri * cab)>>16;ri = (ri * cab)/65536;gi = (gi * cab)/65536;bi = (bi * cab)/65536;//加回来ri += 128;gi += 128;bi += 128;//重新进行一下赋值r = (ri > 255)?255:(ri < 0 ? 0 : ri);b = (bi > 255)?255:(bi < 0 ? 0 : bi);g = (gi > 255)?255:(gi < 0 ? 0 : gi);//以前的这些算法原理不是很清晰,不过是这样算的//一个argb的像素点已经改变了  那么现在要进行的是赋值bitmap.setPixel(x,y,Color.argb(a , r ,g , b));}}long end_time = System.currentTimeMillis();mIv_pic.setImageBitmap(bitmap);
  • 处理时间如下

  • ndk处理代码基本类似 如下:

  jint *pics = env->GetIntArrayElements(pics_, NULL);int newSize=width * height;float brightness = 0.2f;float constract = 0.2f;//开始来处理int a , r , g , b ;//调黑的亮度int bab  = (int) (255 * brightness);//对比度float ca = 1.0f + constract;//再调高一点而已ca *= ca;int cab = (int) (ca * 65536) + 1 ;//开始每一个点来做处理的int x,y;for(x = 0 ; x < width ; x++){for(y = 0 ; y < height ; y++){//获取到每个像素点的颜色值 这个算法 与运算 其实 你到java中Color.alpha(color)的这个跟进去 其实就是这里面的方法int color = pics[y * width + x ];//这个& 0xFF可以看做是只取8bit的数据 (二进制的) argb每个只占用了一个Byte的数据,要把其他位置 归0a = (color >> 24) & 0xFF;r = (color >> 16) & 0xFF;g = (color >> 8) & 0xFF;b = color & 0xFF;//然后减去一个亮度int ri = r - bab;int gi = g - bab;int bi = b - bab;//重新进行一下赋值r = (ri > 255)?255:(ri < 0 ? 0 : ri);b = (bi > 255)?255:(bi < 0 ? 0 : bi);g = (gi > 255)?255:(gi < 0 ? 0 : gi);//对比变化度,主要看大于还是小于0ri = r - 128;gi = g - 128;bi = b - 128;//ri = (ri * cab)/65536 等价于 ri = (ri * cab)>>16;ri = (ri * cab)/65536;gi = (gi * cab)/65536;bi = (bi * cab)/65536;//加回来ri += 128;gi += 128;bi += 128;//重新进行一下赋值r = (ri > 255)?255:(ri < 0 ? 0 : ri);b = (bi > 255)?255:(bi < 0 ? 0 : bi);g = (gi > 255)?255:(gi < 0 ? 0 : gi);//以前的这些算法原理不是很清晰,不过是这样算的//一个argb的像素点已经改变了  那么现在要进行的是赋值 这里 的赋值也看java的里面是如何进行赋值的//Color.argb(a , r ,g , b)中是这么来进行运算的return (alpha << 24) | (red << 16) | (green << 8) | blue;//透明度一般不变化  就直接用0xFFpics[y * width + x] = (0xFF << 24) | (r << 16) | (g << 8) | b;}}jintArray it = (*env).NewIntArray(newSize);(*env).SetIntArrayRegion(it,0,newSize,pics);env->ReleaseIntArrayElements(pics_, pics, 0);
  • 处理时间如下:
  • 由此可见,处理的时间差距还是挺大的。
  • 其实图片在内存中就是一连串的数组的,如果是argb的像素模式存在的话,每个像素点占用1个int的大小,argb每个占用一个byte即8bit的数据量大小,所以很多颜色的调试都是0-255(2^8)范围内来调试的。调整这些argb就可以来调整图片。

    项目下载地址

  • csdn:http://download.csdn.net/detail/the_name_for_yu/9747911

NDK处理图片:通过对比度达到美黑效果相关推荐

  1. 人像美妆效果实现(贴纸)——OpenGL实现

    一.贴纸美妆     人像美妆效果的实现方式有很多种,其中贴纸美妆是最常见也是应用最广泛的一种实现方式.它有实现简单.素材可移植和可复用性高等优点,是目前众多美颜美妆相关的App中应用最多的美妆实现方 ...

  2. Photoshop把漂亮湖景照片调成唯美雪景效果

    Photoshop把漂亮湖景照片调成唯美雪景效果 感兴趣的小伙伴可加群:741090028,暗号:小螺号 常看到有高手用改过的相机或者用红外线滤镜长曝出超梦幻雪景,感觉就像是进入了另一个世界,太美了. ...

  3. 怎么实现EDIUS中闪白和闪黑效果的制作

    常常在编辑视频的时候,会根据情景需要添加闪黑或者闪白效果.那在EDIUS非线性编辑软件中,闪白/闪黑效果需要如何制作呢?本文涉及的EDIUS工具有色块和转场溶化,快来看看小编如何用这两样做出你想要的效 ...

  4. 照片调色系列教程(6):唯美婚纱效果

    珊瑚虫QQ作者被捕的完整视频下载[火热讨论] 秒杀!看老外高手如何玩转人工闪电[火热讨论] 本教程由中国教程网特别供稿. <Photoshop照片调色系列教程>目录: (一)打造格调美女 ...

  5. 强大的滤镜—制作唯美古风效果

    1.去色 Ctrl+J复制一下我们的图像文件,然后在菜单栏中选择[图像]|[调整]|[去色]: 再复制一次我们的源图像,在菜单栏上点击[图像]|[调整]|[反相]: 然后将我们反相的结果所在的图层选择 ...

  6. Photoshop调出田园照片唯美手绘油画效果

    先看看效果图 原片分析:妹子脸上的光不够通透,有些灰暗,整体色调不够分明. 后期思路:色彩往油画风格调整,让画面色彩更加油润.丰富. 基础调整 (1)曝光根据照片的实际情况进行调整 (2)增加阴影部分 ...

  7. 同样是购物狂欢,为什么“美黑五”被天猫“双十一”甩了10倍不止?

    作者:楠沨 [IT战略家] 11月26日早间消息,美国"黑色星期五"("黑五")网购正持续增长.根据Adobe发布的最新报告,今年"黑色星期五&quo ...

  8. Eclipse美(黑)化攻略

    公司现在开发用的还是Eclipse(以下简称ADT),虽然在我看来AndroidStudio(以下简称AS)代替Eclipse是没问题的,但是版本号没到1.0还是让以之投入正式使用的人们有一丝顾虑. ...

  9. 根据Sql生成ER图

    原文 https://blog.csdn.net/qq_17010367/article/details/79212850#commentsedit 1. 根据SQL文件生成ER图 首先准备好SQL文 ...

最新文章

  1. 【傻瓜教程】CentOS 7 下 LNMP 环境搭建过程
  2. android通知栏半透明,Android开发实现透明通知栏
  3. java点到直线的投影点到经纬度_12分高考答题必刷题型,“空间向量分析点到线的距离问题”...
  4. pgjdbc源码分析
  5. python替换文本文件单词_在大型文本文件中替换一组单词
  6. python——while 语句
  7. 专科学历事业单位工资计算机,事业单位人来告诉你:学历跟入编之后待遇关系有多大!很直接...
  8. 海德汉编程详细手册_UG编程海德汉系统螺旋铣孔最后一刀欠切解决方案
  9. CALayer 4 详解 -----转自李明杰
  10. 机器学习算法(6)——随机森林
  11. 消消乐实现下坠_手把手教你如何实现iOS消消乐小游戏Demo
  12. UNIX 环境高级编程(五)—— unistd.h
  13. 什么是C++标准库?
  14. 刷机工具-fastboot
  15. 上古卷轴5json文件修改_捏脸工具-RaceMenu
  16. 开源帮助:什么是退出代码 137,你能修复它吗?
  17. NFormer: robust person re-identification with neighbor transformer
  18. java程序license验证_基于TrueLicense实现产品License验证功能
  19. Snakemake报错Outputs of incorrect type
  20. .env .env.development .env.production 配置说明

热门文章

  1. 2005/4.16/多云转晴
  2. v-charts 多个环形图
  3. 安防监控实现之控制命令下发(命令下发--html通过CGI与用户进程交互)
  4. 美团数据平台融合实践
  5. 三、内存管理 (一)存储器管理
  6. 现代汽车CMO使用基于AI的社交智能工具深入了解千禧一代
  7. 数据能力加持,利尔达携手智能企业助力智慧校园建设
  8. 最近一波对中文编程(包括中文命名)的攻势
  9. matlab 编程波形图,实验一MATLAB编程环境及其常用信号的生成及其波形仿真.doc
  10. 浅水区学游泳文字描述过程