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

相关文章

SpringBoot结合Knife4j进行API分组授权管理配置详解

《SpringBoot结合Knife4j进行API分组授权管理配置详解》在现代的微服务架构中,API文档和授权管理是不可或缺的一部分,本文将介绍如何在SpringBoot应用中集成Knife4j,并进... 目录环境准备配置 Swagger配置 Swagger OpenAPI自定义 Swagger UI 底

解决hive启动时java.net.ConnectException:拒绝连接的问题

《解决hive启动时java.net.ConnectException:拒绝连接的问题》Hadoop集群连接被拒,需检查集群是否启动、关闭防火墙/SELinux、确认安全模式退出,若问题仍存,查看日志... 目录错误发生原因解决方式1.关闭防火墙2.关闭selinux3.启动集群4.检查集群是否正常启动5.

SpringBoot集成EasyExcel实现百万级别的数据导入导出实践指南

《SpringBoot集成EasyExcel实现百万级别的数据导入导出实践指南》本文将基于开源项目springboot-easyexcel-batch进行解析与扩展,手把手教大家如何在SpringBo... 目录项目结构概览核心依赖百万级导出实战场景核心代码效果百万级导入实战场景监听器和Service(核心

idea Maven Springboot多模块项目打包时90%的问题及解决方案

《ideaMavenSpringboot多模块项目打包时90%的问题及解决方案》:本文主要介绍ideaMavenSpringboot多模块项目打包时90%的问题及解决方案,具有很好的参考价值,... 目录1. 前言2. 问题3. 解决办法4. jar 包冲突总结1. 前言之所以写这篇文章是因为在使用Mav

Spring Security6.3.x的使用指南与注意事项

《SpringSecurity6.3.x的使用指南与注意事项》SpringSecurity6.3.1基于现代化架构,提供简洁配置、增强默认安全性和OAuth2.1/OIDC支持,采用Lambda... 目录介绍基础配置 (Servlet 应用 - 使用 Lambda DSL)关键配置详解(Lambda DS

Java Stream 的 Collectors.toMap高级应用与最佳实践

《JavaStream的Collectors.toMap高级应用与最佳实践》文章讲解JavaStreamAPI中Collectors.toMap的使用,涵盖基础语法、键冲突处理、自定义Map... 目录一、基础用法回顾二、处理键冲突三、自定义 Map 实现类型四、处理 null 值五、复杂值类型转换六、处理

setsid 命令工作原理和使用案例介绍

《setsid命令工作原理和使用案例介绍》setsid命令在Linux中创建独立会话,使进程脱离终端运行,适用于守护进程和后台任务,通过重定向输出和确保权限,可有效管理长时间运行的进程,本文给大家介... 目录setsid 命令介绍和使用案例基本介绍基本语法主要特点命令参数使用案例1. 在后台运行命令2.

基于Python Playwright进行前端性能测试的脚本实现

《基于PythonPlaywright进行前端性能测试的脚本实现》在当今Web应用开发中,性能优化是提升用户体验的关键因素之一,本文将介绍如何使用Playwright构建一个自动化性能测试工具,希望... 目录引言工具概述整体架构核心实现解析1. 浏览器初始化2. 性能数据收集3. 资源分析4. 关键性能指

使用Redis快速实现共享Session登录的详细步骤

《使用Redis快速实现共享Session登录的详细步骤》在Web开发中,Session通常用于存储用户的会话信息,允许用户在多个页面之间保持登录状态,Redis是一个开源的高性能键值数据库,广泛用于... 目录前言实现原理:步骤:使用Redis实现共享Session登录1. 引入Redis依赖2. 配置R

SpringBoot实现RSA+AES自动接口解密的实战指南

《SpringBoot实现RSA+AES自动接口解密的实战指南》在当今数据泄露频发的网络环境中,接口安全已成为开发者不可忽视的核心议题,RSA+AES混合加密方案因其安全性高、性能优越而被广泛采用,本... 目录一、项目依赖与环境准备1.1 Maven依赖配置1.2 密钥生成与配置二、加密工具类实现2.1