本文主要是介绍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;
}
这篇关于java 图像美白,使用NDK和JNI调整图片的亮度和对比度,类似QQ离线头像显示灰,使用mk编写脚本...的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!