jni实现图片的线性透明效果

代码地址: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;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值