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变灰
ndk图标变灰类似QQ头像离线显示-C++代码如下:
/*
* Class:
* : 变灰处理
* : ([III)[I
*/
"C" ( *env, type,
data_, jint w, jint h) {
jint *data = env->(data_, NULL);
if (data == NULL) {
0; /* null异常发生 */
int alpha = 0xFF > 16);//R
int green = ((color & ) >> 8);//G
int blue = color & ;//B
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];
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);
;