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

阅读: 评论:0

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

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的值

演示效果图:

原图

.

ndk对比度

.

ndk变灰

.

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;

}

本文发布于:2024-02-01 12:15:55,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170676095736528.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:离线   对比度   美白   亮度   脚本
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23