一、涉及到的jni编程知识
Java基本类型的数组,在JNI中都是jArray的类型格式。具体类型如下:
typedef jarray jbooleanArray;
typedef jarray jbyteArray;
typedef jarray jcharArray;
typedef jarray jshortArray;
typedef jarray jintArray;
typedef jarray jlongArray;
typedef jarray jfloatArray;
typedef jarray jdoubleArray;
typedef jarray jobjectArray;
jArray类型JNI定义的类型,通过它JNIEnv可以操作Java数组,但它并不是C/C++的数组,所以我们要把jArray类型转换为C/C++中的数组。
JNIEnv定义了一系列的方法来把一个jArray类型转换为C/C++数组,和把C/C++数组转换为jArray
1、Java基本类型的数组转换成相应的C数组类型 
    jboolean*   (*GetBooleanArrayElements)(JNIEnv*, jbooleanArray, jboolean*);
    jbyte*      (*GetByteArrayElements)(JNIEnv*, jbyteArray, jboolean*);
    jchar*      (*GetCharArrayElements)(JNIEnv*, jcharArray, jboolean*);
    jshort*     (*GetShortArrayElements)(JNIEnv*, jshortArray, jboolean*);
    jint*       (*GetIntArrayElements)(JNIEnv*, jintArray, jboolean*);
    jlong*      (*GetLongArrayElements)(JNIEnv*, jlongArray, jboolean*);
    jfloat*     (*GetFloatArrayElements)(JNIEnv*, jfloatArray, jboolean*);
    jdouble*    (*GetDoubleArrayElements)(JNIEnv*, jdoubleArray, jboolean*);
参数:
env:JNI 接口指针。        
array:Java 字符串对象。        
isCopy:指向布尔值的指针。        
返回值:        
返回指向数组元素的指针,如果操作失败,则为 NULL。
2、获取数组的长度:
     jsize       (*GetArrayLength)(JNIEnv*, jarray);
3、释放C/C++的数组内存
     void        (*ReleaseBooleanArrayElements)(JNIEnv*, jbooleanArray,jboolean*, jint); 
     void        (*ReleaseByteArrayElements)(JNIEnv*, jbyteArray,jbyte*, jint);
     void        (*ReleaseCharArrayElements)(JNIEnv*, jcharArray,jchar*, jint);
     void        (*ReleaseShortArrayElements)(JNIEnv*, jshortArray,jshort*, jint);
     void        (*ReleaseIntArrayElements)(JNIEnv*, jintArray,jint*, jint);
     void        (*ReleaseLongArrayElements)(JNIEnv*, jlongArray,jlong*, jint);
     void        (*ReleaseFloatArrayElements)(JNIEnv*, jfloatArray,jfloat*, jint);
     void        (*ReleaseDoubleArrayElements)(JNIEnv*, jdoubleArray,jdouble*, jint);
参数:        
env:JNI 接口指针。        
array:Java 数组对象。        
elems:指向数组元素的指针。        
mode:释放模式。
4、构造一个指定长度的Java基本类型的数组
     jbooleanArray (*NewBooleanArray)(JNIEnv*, jsize);
     jbyteArray    (*NewByteArray)(JNIEnv*, jsize);
     jcharArray    (*NewCharArray)(JNIEnv*, jsize);
     jshortArray   (*NewShortArray)(JNIEnv*, jsize);
     jintArray     (*NewIntArray)(JNIEnv*, jsize);
     jlongArray    (*NewLongArray)(JNIEnv*, jsize);
     jfloatArray   (*NewFloatArray)(JNIEnv*, jsize);
     jdoubleArray  (*NewDoubleArray)(JNIEnv*, jsize); 
5、给java基本类型的数组赋值
     void  (*SetBooleanArrayRegion)(JNIEnv*, jbooleanArray,jsize, jsize, const jboolean*);
     void  (*SetByteArrayRegion)(JNIEnv*, jbyteArray,jsize, jsize, const jbyte*);
     void  (*SetCharArrayRegion)(JNIEnv*, jcharArray,jsize, jsize, const jchar*);
     void  (*SetShortArrayRegion)(JNIEnv*, jshortArray,jsize, jsize, const jshort*);
     void  (*SetIntArrayRegion)(JNIEnv*, jintArray,jsize, jsize, const jint*);
     void  (*SetLongArrayRegion)(JNIEnv*, jlongArray,jsize, jsize, const jlong*);
     void  (*SetFloatArrayRegion)(JNIEnv*, jfloatArray,jsize, jsize, const jfloat*);
     void  (*SetDoubleArrayRegion)(JNIEnv*, jdoubleArray, jsize, jsize, const jdouble*); 
把java基本类型的数组中的指定范围的元素用C/C++的数组中的元素来赋值
参数:        
env:JNI 接口指针。        
array:  Java 数组。        
start:起始下标。        
len:要复制的元素数。        
buf:源缓冲区。        
抛出:        
ArrayIndexOutOfBoundsException:如果区域中的某个下标无效。
注意:
如果是c程序,要用 (*env)-> 
如果是C++要用 env->
在linux下如果.c文件中用 “env->” 编译会找不到此结构,必须用“(*env)->”,或者改成.cpp文件,以 c++的方式来编译。
具体请看一下jni.h的代码。另外还有些省略的内容,可以参考JNI的文档:Java Native Interface 6.0 Specification,在JDK的文档里就可以找到。如果要进行更深入的JNI编程,需要仔细阅读这个文档
 
二、图像灰度化
彩色转灰度的著名心理学公式:Gray = R*0.299 + G*0.587 + B*0.114
实际应用中为了避免浮点运算,然后就有了移位运算代替了。
2至20位精度的系数:
Gray = (R*1 + G*2 + B*1) >> 2 
Gray = (R*2 + G*5 + B*1) >> 3 
Gray = (R*4 + G*10 + B*2) >> 4 
Gray = (R*9 + G*19 + B*4) >> 5 
Gray = (R*19 + G*37 + B*8) >> 6 
Gray = (R*38 + G*75 + B*15) >> 7 
Gray = (R*76 + G*150 + B*30) >> 8 
Gray = (R*153 + G*300 + B*59) >> 9 
Gray = (R*306 + G*601 + B*117) >> 10 
Gray = (R*612 + G*1202 + B*234) >> 11 
Gray = (R*1224 + G*2405 + B*467) >> 12 
Gray = (R*2449 + G*4809 + B*934) >> 13 
Gray = (R*4898 + G*9618 + B*1868) >> 14 
Gray = (R*9797 + G*19235 + B*3736) >> 15 
Gray = (R*19595 + G*38469 + B*7472) >> 16 
Gray = (R*39190 + G*76939 + B*14943) >> 17 
Gray = (R*78381 + G*153878 + B*29885) >> 18 
Gray = (R*156762 + G*307757 + B*59769) >> 19 
Gray = (R*313524 + G*615514 + B*119538) >> 20
 
三、灰度化代码实现
JNIEXPORT jintArray JNICALL Java_org_join_image_util_JoinImage_imgToGray( 
        JNIEnv* env, jobject obj, jintArray buf, int w, int h) { 
    LOGE("==imgToGray=="); 
 
    jint * cbuf; 
    cbuf = (*env)->GetIntArrayElements(env, buf, 0); // 获取int数组元素 
   
    int alpha = 0xFF; // 不透明值 
    int i, j, color, red, green, blue; 
    for (i = 0; i < h; i++) { 
        for (j = 0; j < w; j++) { 
            color = cbuf[w * i + j]; // 获得color值 
            red = (color >> 16) & 0xFF; // 获得red值 
            green = (color >> 8) & 0xFF; // 获得green值 
            blue = color & 0xFF; // 获得blue值 
            color = (red * 38 + green * 75 + blue * 15) >> 7; // 灰度算法(16位运算下7位精度) 
            color = (alpha << 24) | (color << 16) | (color << 8) | color; // 由ARGB组成新的color值 
            cbuf[w * i + j] = color; // 设置新color值 
        } 
    } 
 
    int size = w * h; 
    jintArray result = (*env)->NewIntArray(env, size); // 新建一个jintArray 
    (*env)->SetIntArrayRegion(env, result, 0, size, cbuf); // 将cbuf转存入result 
    (*env)->ReleaseIntArrayElements(env, buf, cbuf, 0); // 释放int数组元素 
    return result; 
 
 
本文欢迎转载,但请注明出处与作者
出处:http://blog.sina.com.cn/staratsky
作者:流星

深入了解android平台的jni---图像灰度化处理的更多相关文章

  1. java实现图像灰度化

    /*在研究Java实现将一张图片转成字符画的时候,发现将图像转化字符串是根据照片的灰度采用不同的字符画出来,形成一个灰度表.于是就研究了下关于灰度值这个东西,于是跳了一个大坑...因为鄙人用的ubun ...

  2. c#图像灰度化、灰度反转、二值化

    图像灰度化:将彩色图像转化成为灰度图像的过程成为图像的灰度化处理.彩色图像中的每个像素的颜色有R.G.B三个分量决定,而每个分量有255中值可取,这样一个像素点可以有1600多万(255*255*25 ...

  3. Win8MetroC#数字图像处理--2.1图像灰度化

    原文:Win8MetroC#数字图像处理--2.1图像灰度化   [函数说明] 图像灰度化函数GrayProcess(WriteableBitmap src) [算法说明]   图像灰度化就是去掉彩色 ...

  4. 深入学习OpenCV中图像灰度化原理,图像相似度的算法

    最近一段时间学习并做的都是对图像进行处理,其实自己也是新手,各种尝试,所以我这个门外汉想总结一下自己学习的东西,图像处理的流程.但是动起笔来想总结,一下却不知道自己要写什么,那就把自己做过的相似图片搜 ...

  5. java+opencv实现图像灰度化

    灰度图像上每个像素的颜色值又称为灰度,指黑白图像中点的颜色深度,范围一般从0到255,白色为255,黑色为0.所谓灰度值是指色彩的浓淡程度,灰度直方图是指一幅数字图像中,对应每一个灰度值统计出具有该灰 ...

  6. Python图像处理丨基于OpenCV和像素处理的图像灰度化处理

    摘要:本篇文章讲解图像灰度化处理的知识,结合OpenCV调用cv2.cvtColor()函数实现图像灰度操作,使用像素处理方法对图像进行灰度化处理. 本文分享自华为云社区<[Python图像处理 ...

  7. 深入了解android平台的jni(二)

    Android.mk是Android提供的一种makefile文件,用来指定诸如编译生成so库名.引用的头文件目录.需要编译的.c/.cpp文件和.a静态库文件等.要掌握jni,就必须熟练掌握Andr ...

  8. Java图像灰度化的实现过程解析

    概要 本文主要介绍了灰度化的几种方法,以及如何使用Java实现灰度化.同时分析了网上一种常见却并不妥当的Java灰度化实现,以及证明了opencv的灰度化是使用“加权灰度化”法 24位彩色图与8位灰度 ...

  9. java 图像灰度化与二值化

    转载:http://www.chinasb.org/archives/2013/01/5053.shtml 1: package org.chinasb.client; 2: 3: import ja ...

随机推荐

  1. 高级正则表达式技术(Python版)

    正则表达式是从信息中搜索特定的模式的一把瑞士军刀.它们是一个巨大的工具库,其中的一些功能经常被忽视或未被充分利用.今天我将向你们展示一些正则表达式的高级用法. 举个例子,这是一个我们可能用来检测电话美 ...

  2. ps 图片提取线稿方法2种 转

  3. MVC linq To SQL更新数据库操作

    首先在视图中提交数据,使用Html.BeginForm() @using(Html.BeginForm()) { @Html.EditorForModel() //编辑模板.控制器中传过来的数据 &l ...

  4. effective c++:virtual函数在构造函数和析构函数中的注意事项

    如不使用自动生成函数要明确拒绝 对于一个类,如果你没有声明,c++会自动生成一个构造函数,一个析构函数,一个copy构造函数和一个copy assignment操作符. class Empty { p ...

  5. SSO单点登录在web上的关键点 cookie跨域

    概述 其实WEB单点登录的原理挺简单的,抛开那些复杂的概念,简单来讲讲如何实现一个最基本的单点登录 首先需要有两个程序 例如:http://www.site-a.com 我们简称A http://ww ...

  6. 数据库 CHECKDB 发现了x个分配错误和 x 个一致性错误

    --1.在SQL查询分析器中执行以下语句:(注以下所用的POS为数据库名称,请用户手工改为自己的数据库名) use pos dbcc checkdb --2.查看查询结果,有很多红色字体显示,最后结果 ...

  7. Home vs2013

        Microsoft Visual Studio Ultimate 2013 版本 12.0.30110.00 Update 1 Microsoft .NET Framework 版本 4.5. ...

  8. 从今天开始每天刷一题,并写在这里 分类: ACM 2015-06-16 23:52 14人阅读 评论(0) 收藏

    开始什么题都可以,后面会加大难度. 每天! 如果有一天有特殊情况,也要来这里打卡,并说明原因,并在其他某一天补上! 版权声明:本文为博主原创文章,未经博主允许不得转载.

  9. 3.emWin5.26(ucGui)VS2008 2-D图形库-基本绘图【Worldsing笔记】

    UCGUI(emWin) 2-D图形库--之基本板绘图,在ucgui的基本绘图功能上来看,功能还是比较全的,本例程主要使用基本的接口,两个主要的概念是绘制(draw)和填充(Fill),这两的区别是一 ...

  10. How Tomcat Works(九)

    本文接下来描述servlet容器是怎样管理其相关组件的生命周期的,首先本人描述一下事件监听模式,也可以称为观察者模式,该模式分为以下角色 即抽象主题角色 具体主题角色 抽象观察者角色及具体观察者角色, ...