代码地址:https://github.com/zhangjinself/QQReadBg
上次文章说如果图片数量比较大,可以使用jni实现,今天就来讲一下如何用jni实现线性透明效果,上篇文章
https://blog.csdn.net/zhjin8510/article/details/87096478
一、其实实现原理与java版差不多
这里使用 jintArray 把图片的所有像素点传入进来,w,h分别是图片的宽和高,
1、由于十六进制最高为FF 为十进制的255,所以,用图片的高除以255,这样子,就可以实现从0到ff的透明度计算
2、十六进制加1的计算方法为 +0x01000000
3、然后对图片的高进行循环,再对宽进行循环,如果高取余结果为val为0,则透明度加1
4、上面再返回像素的数组即可,这里用这个方法大概比上一篇java实现快一倍,
5、这里的ndk使用的是16的
#include <jni.h>
#include <string>
extern "C"
JNIEXPORT jintArray JNICALL
Java_com_sinping_arouter_myandroid_view_JniTest_updateImage(
JNIEnv *env, jobject instance, jintArray data_, jint w, jint h) {
jint *data;
//获取数组中的元素
data = env->GetIntArrayElements(data_, NULL);
if (data == NULL) {
return 0;
}
///从0开始计算像素透明度
int sum =0x00FFFFFF;
//255为FF的十进制,根据屏幕高度计算出透明度增加的比例
int val= h/255+1;
for (int i = 0; i < h; i++) {
//取余比例
if(i%val==0)
sum=sum+0x01000000;
for (int j = 0; j < w; j++) {
int color = data[w * i + j];
// int alpha=((color & 0xFF000000) >> 24);
// int red = ((color & 0x00FF0000) >> 16);
// int green = ((color & 0x0000FF00) >> 8);
// int blue = (color & 0x000000FF);
color=color & sum;
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;
}