java 图像美白,使用NDK和JNI调整图片的亮度和对比度

-
使用NDK和JNI调整图片的亮度和对比度,类似QQ离线头像显示灰 , 使用mk编写脚本 。
做过Java的同学可能经常会遇到一些关于图片处理的
例如类似QQ离线头像显示灰的 。最快的算法是用来实现 。这里通过Java调用JNI来处理每一个像素来实现 。
1、对每一个像素点取出RGB每个通道的值R,G,B
2、=(R+G+B)/3;这个值是需要修改的值
3、将原来GRB的通道全设置成color的值
演示效果图:
原图
ndk对比度
ndk变灰
【java 图像美白,使用NDK和JNI调整图片的亮度和对比度】ndk图标变灰类似QQ头像离线显示-C++代码如下:
/*
* Class:
* :变灰处理
* : ([III)[I
*/
"C"( *env,type,
data_, jint w, jint h) {
jint *data = http://www.kingceram.com/post/env->(data_, NULL);
if (data =http://www.kingceram.com/post/= NULL) {
0; /* null异常发生 */
int alpha = 0xFF > 16);//R
int green = ((color & ) >> 8);//G
int blue = color & ;//B

java 图像美白,使用NDK和JNI调整图片的亮度和对比度

文章插图
color = (red + green + blue) / 3;//这个值是需要修改的值
//将原来GRB的通道全设置成color的值
color = alpha | (color (, 0, size, data);
env->nts(data_, data, 0);
;
NDK调整图片的亮度和对比度-C++代码如下:
/*
* Class:
* :调整图片的亮度和对比度
* : ([III)[I
*/
"C"
( * env,jclz,, jint width, jint ){
jint*= env->(, 0);
int= width * ;
//亮度、对比度 这两个参数可以传进来
float= 0.2f,= 0.2f;
int bab = (int)(255 * );
//开始处理
int a, r, g, b;
//实际设置的对比度
int cab = (int)( * 65536) + 1;
//遍历所有的像素点
int x = 0, y = 0;
for(x = 0; x < width; x++){
for(y = 0; y < ; y++){
//获得每个像素点的颜色值
int color = [y * width + x];
java 图像美白,使用NDK和JNI调整图片的亮度和对比度

文章插图
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);
//设置图像像素点的调整后的色值
//.(x, y, Color.argb(a, r, g, b));//参照的源码
int= (a nts( , , 0);
;