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

演示效果图:

原图

.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;

}

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



http://www.chinasem.cn/article/533616

相关文章

Git可视化管理工具(SourceTree)使用操作大全经典

《Git可视化管理工具(SourceTree)使用操作大全经典》本文详细介绍了SourceTree作为Git可视化管理工具的常用操作,包括连接远程仓库、添加SSH密钥、克隆仓库、设置默认项目目录、代码... 目录前言:连接Gitee or github,获取代码:在SourceTree中添加SSH密钥:Cl

Java NoClassDefFoundError运行时错误分析解决

《JavaNoClassDefFoundError运行时错误分析解决》在Java开发中,NoClassDefFoundError是一种常见的运行时错误,它通常表明Java虚拟机在尝试加载一个类时未能... 目录前言一、问题分析二、报错原因三、解决思路检查类路径配置检查依赖库检查类文件调试类加载器问题四、常见

Java注解之超越Javadoc的元数据利器详解

《Java注解之超越Javadoc的元数据利器详解》本文将深入探讨Java注解的定义、类型、内置注解、自定义注解、保留策略、实际应用场景及最佳实践,无论是初学者还是资深开发者,都能通过本文了解如何利用... 目录什么是注解?注解的类型内置注编程解自定义注解注解的保留策略实际用例最佳实践总结在 Java 编程

Python中模块graphviz使用入门

《Python中模块graphviz使用入门》graphviz是一个用于创建和操作图形的Python库,本文主要介绍了Python中模块graphviz使用入门,具有一定的参考价值,感兴趣的可以了解一... 目录1.安装2. 基本用法2.1 输出图像格式2.2 图像style设置2.3 属性2.4 子图和聚

windows和Linux使用命令行计算文件的MD5值

《windows和Linux使用命令行计算文件的MD5值》在Windows和Linux系统中,您可以使用命令行(终端或命令提示符)来计算文件的MD5值,文章介绍了在Windows和Linux/macO... 目录在Windows上:在linux或MACOS上:总结在Windows上:可以使用certuti

CentOS和Ubuntu系统使用shell脚本创建用户和设置密码

《CentOS和Ubuntu系统使用shell脚本创建用户和设置密码》在Linux系统中,你可以使用useradd命令来创建新用户,使用echo和chpasswd命令来设置密码,本文写了一个shell... 在linux系统中,你可以使用useradd命令来创建新用户,使用echo和chpasswd命令来设

Python使用Matplotlib绘制3D曲面图详解

《Python使用Matplotlib绘制3D曲面图详解》:本文主要介绍Python使用Matplotlib绘制3D曲面图,在Python中,使用Matplotlib库绘制3D曲面图可以通过mpl... 目录准备工作绘制简单的 3D 曲面图绘制 3D 曲面图添加线框和透明度控制图形视角Matplotlib

Pandas中统计汇总可视化函数plot()的使用

《Pandas中统计汇总可视化函数plot()的使用》Pandas提供了许多强大的数据处理和分析功能,其中plot()函数就是其可视化功能的一个重要组成部分,本文主要介绍了Pandas中统计汇总可视化... 目录一、plot()函数简介二、plot()函数的基本用法三、plot()函数的参数详解四、使用pl

电脑显示mfc100u.dll丢失怎么办?系统报错mfc90u.dll丢失5种修复方案

《电脑显示mfc100u.dll丢失怎么办?系统报错mfc90u.dll丢失5种修复方案》最近有不少兄弟反映,电脑突然弹出“mfc100u.dll已加载,但找不到入口点”的错误提示,导致一些程序无法正... 在计算机使用过程中,我们经常会遇到一些错误提示,其中最常见的就是“找不到指定的模块”或“缺少某个DL

使用Python实现IP地址和端口状态检测与监控

《使用Python实现IP地址和端口状态检测与监控》在网络运维和服务器管理中,IP地址和端口的可用性监控是保障业务连续性的基础需求,本文将带你用Python从零打造一个高可用IP监控系统,感兴趣的小伙... 目录概述:为什么需要IP监控系统使用步骤说明1. 环境准备2. 系统部署3. 核心功能配置系统效果展