java 图像美白,使用NDK和JNI调整图片的亮度和对比度,类似QQ离线头像显示灰,使用mk编写脚本...

FcfrtNdkPic-master

使用NDK和JNI调整图片的亮度和对比度,类似QQ离线头像显示灰,使用mk编写脚本。

做过Java的同学可能经常会遇到一些关于图片处理的

例如类似QQ离线头像显示灰的。最快的算法是用colorMatrix来实现。这里通过Java调用JNI来处理每一个像素来实现。

1、对每一个像素点取出RGB每个通道的值R,G,B

2、cololr=(R+G+B)/3;这个值是需要修改的值

3、将原来GRB的通道全设置成color的值

演示效果图:

原图

.59b1f2299f015326fca5a63953bb5fe2.png

ndk对比度

.ndk%E5%AF%B9%E6%AF%94%E5%BA%A6.jpg

ndk变灰

.bc1f61fd2c564b0b2ccc8797c45f6c57.png

ndk图标变灰类似QQ头像离线显示-C++代码如下:

/*

* Class: com_fcfrt_ndkpic_utils_FcfrtImageUtil

* Method: getFcfrtImgToGray 变灰处理

* Signature: ([III)[I

*/

extern "C" JNIEXPORT jintArray JNICALL Java_com_fcfrt_ndkpic_utils_FcfrtImageUtil_getFcfrtImgToGray(JNIEnv *env, jclass type,

jintArray data_, jint w, jint h) {

jint *data = env->GetIntArrayElements(data_, NULL);

if (data == NULL) {

return 0; /* null异常发生 */

}

int alpha = 0xFF << 24;

for (int i = 0; i < h; i++) {

for (int j = 0; j < w; j++) {

// 获得像素的颜色 对每一个像素点取出RGB每个通道的值R,G,B

int color = data[w * i + j];

int red = ((color & 0x00FF0000) >> 16);//R

int green = ((color & 0x0000FF00) >> 8);//G

int blue = color & 0x000000FF;//B

color = (red + green + blue) / 3;//这个值是需要修改的值

//将原来GRB的通道全设置成color的值

color = alpha | (color << 16) | (color << 8) | color;

data[w * i + j] = color;

}

}

int size=w * h;

jintArray result = env->NewIntArray(size);

env->SetIntArrayRegion(result, 0, size, data);

env->ReleaseIntArrayElements(data_, data, 0);

return result;

}

NDK调整图片的亮度和对比度-C++代码如下:

/*

* Class: com_fcfrt_ndkpic_utils_FcfrtImageUtil

* Method: getFcfrtImage 调整图片的亮度和对比度

* Signature: ([III)[I

*/

extern "C" JNIEXPORT jintArray JNICALL Java_com_fcfrt_ndkpic_utils_FcfrtImageUtil_getFcfrtImage

(JNIEnv * env, jclass jclz, jintArray buffer, jint width, jint height){

jint* source = env->GetIntArrayElements(buffer, 0);

int newsize = width * height;

//亮度、对比度 这两个参数可以传进来

float brightness = 0.2f, constrat = 0.2f;

int bab = (int)(255 * brightness);

//开始处理

int a, r, g, b;

//实际设置的对比度

int cab = (int)(constrat * 65536) + 1;

//遍历所有的像素点

int x = 0, y = 0;

for(x = 0; x < width; x++){

for(y = 0; y < height; y++){

//获得每个像素点的颜色值

int color = source[y * width + x];

a = (color >> 24) & 0xFF;

r = (color >> 16) & 0xFF;

g = (color >> 8) & 0xFF;

b = color & 0xFF;

//美白argb的值都变大

//美黑argb的值都变小

int rr = r - bab;

int gr = g - bab;

int br = b - bab;

//边界检测

r = rr > 255 ? 255 : (rr < 0 ? 0 : rr);

g = gr > 255 ? 255 : (gr < 0 ? 0 : gr);

b = br > 255 ? 255 : (br < 0 ? 0 : br);

//~~对比度变化,255的一半来比较 策略:让比较亮的更加量,让比较暗的更加暗

//int ri = r - 128;

//int gi = g - 128;

//int bi = b - 128;

int ri = (((r - 128) * cab) >> 16) + 128; //位移十六位 相当于对比度扩大

int gi = (((g - 128) * cab) >> 16) + 128;

int bi = (((b - 128) * cab) >> 16) + 128;

//边界检测

r = rr > 255 ? 255 : (rr < 0 ? 0 : rr);

g = gr > 255 ? 255 : (gr < 0 ? 0 : gr);

b = br > 255 ? 255 : (br < 0 ? 0 : br);

//设置图像像素点的调整后的色值

//result.setPixel(x, y, Color.argb(a, r, g, b));//参照android的源码

int newColor = (a << 24) | (r << 16) | (g << 8) | b;

source[y * width + x] = newColor; //设置到原先值

}

}

//指针转成jint

jintArray result = env->NewIntArray( newsize);

env->SetIntArrayRegion(result , 0, newsize, source);

//释放内存

env->ReleaseIntArrayElements( buffer, source, 0);

return result;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值