仿qq阅读书籍背景高斯模糊后的透明线性淡化(毛玻璃)效果

代码地址:https://github.com/zhangjinself/QQReadBg

用到的基础知识       

        一、两种模糊库

               工作中要用到高斯模糊的事的图片做背景图,在android下面实现高斯模糊,有两种方法,

                一种是谷歌自带的RenderScript 模糊,还有一种是FastBlur 实现高斯模糊, 这两种模糊方法,都是利用矩阵的原理进行模糊,这里也是引用了这种模糊,但是这种模糊后的效果没有经常去色处理,会导致模糊后的图片,颜色过重,如果背景图上有字,会显示的非常不清晰。

      二、图片像素存储的基本知识

               图片一般分为32位(ARGB_8888)和16位(ARGB_4444/ARGB565)。前面代表颜色通道,后面代表每个颜色所占的字节,

这里就是使用了对透明度的计算,来实现图片的线性淡化效果

    三、十六进制的基础计算

            在十六进制中,0x00ffffff,加1为0x01ffffff....0x09ffffff,0x0affffff,0x0bfffff,0x0cfffff,0x0dfffff,0x0effffff,0x0fffffff ,0x10ffffff......如果透明度累加不正常,也会显示会有线的感觉,达不到效果。

  具体实现

在对图片进行高斯模糊后,如果是颜色较重的图片比如黑色,做为背景色效果会非常不理想,并且设为图片全部透明也达不到效果看下图,上面的图片是原图,下面的图片是模糊后的图片,一共有四行文字,其中第一行是黑色的,但是黑色的文字明显看不到的。

模糊后的图片

 

我们看一看模糊后的图片,  可以看到,经过线性淡化后的图片,将会对图片的颜色统计去色处理,黑色的文字也可以显示出来

代码实现

       这里使用的glide的Transformation 进行处理, 首先获取图片的大小的所有像素点

    int w=newBitmap.getWidth();
    int h=newBitmap.getHeight();
    int[] pix = new int[w*h];
    newBitmap.getPixels(pix, 0, w, 0, 0, w, h);

然后对像素点进行循环,我是按100处理的, 这里使用了16的透明度每次加1,从上部模糊效果较重,下面模糊较以,实现线性模糊

 int val =pix.length/100;
        int a=0x00ffffff;
        for(int x=0;x<pix.length; x++){
            if(x>=val*99)
            {
                a=0x01ffffff;
            }else if(x>val*98)
            {
                a=0x02ffffff;
            }
            else if(x>val*97)
            {
                a=0x03ffffff;
            }

            else if(x>val*96)
            {
                a=0x04ffffff;
            }

            else if(x>val*95)
            {
                a=0x05ffffff;
            }

            else if(x>val*94)
            {
                a=0x06ffffff;
            }

            else if(x>val*93)
            {
                a=0x07ffffff;
            }

            else if(x>val*92)
            {
                a=0x08ffffff;
            }

            else if(x>val*91)
            {
                a=0x09ffffff;
            }
            else if(x>val*90)
            {
                a=0x0affffff;
            }
            else if(x>val*89)
            {
                a=0x0bffffff;
            }
            else if(x>val*88)
            {
                a=0x0cffffff;
            }
            else if(x>val*87)
            {
                a=0x0dffffff;
            }
            else if(x>val*86)
            {
                a=0x0effffff;
            }
            else if(x>val*85)
            {
                a=0x0fffffff;
            }
            else if(x>val*84)
            {
                a=0x10ffffff;
            }
            else if(x>val*83)
            {
                a=0x11ffffff;
            }
            else if(x>val*82)
            {
                a=0x12ffffff;
            }
            else if(x>val*81)
            {
                a=0x13ffffff;
            }
            else if(x>val*80)
            {
                a=0x14ffffff;
            }

            else if(x>val*79)
            {
                a=0x15ffffff;
            }
            else if(x>val*78)
            {
                a=0x16ffffff;
            }
            else if(x>val*77)
            {
                a=0x17ffffff;
            }
            else if(x>val*76)
            {
                a=0x18ffffff;
            }
            else if(x>val*75)
            {
                a=0x19ffffff;
            }
            else if(x>val*74)
            {
                a=0x1affffff;
            }
            else if(x>val*73)
            {
                a=0x1bffffff;
            }
            else if(x>val*72)
            {
                a=0x1cffffff;
            }
            else if(x>val*71)
            {
                a=0x1dffffff;
            }
            else if(x>val*70)
            {
                a=0x1effffff;
            }

            else if(x>val*69)
            {
                a=0x1fffffff;
            }
            else if(x>val*68)
            {
                a=0x20ffffff;
            }
            else if(x>val*67)
            {
                a=0x21ffffff;
            }
            else if(x>val*66)
            {
                a=0x22ffffff;
            }
            else if(x>val*65)
            {
                a=0x23ffffff;
            }
            else if(x>val*64)
            {
                a=0x24ffffff;
            }
            else if(x>val*63)
            {
                a=0x25ffffff;
            }
            else if(x>val*62)
            {
                a=0x26ffffff;
            }
            else if(x>val*61)
            {
                a=0x27ffffff;
            }
            else if(x>val*60)
            {
                a=0x28ffffff;
            }

            else if(x>val*59)
            {
                a=0x29ffffff;
            }
            else if(x>val*58)
            {
                a=0x2affffff;
            }
            else if(x>val*57)
            {
                a=0x2bffffff;
            }
            else if(x>val*56)
            {
                a=0x2cffffff;
            }
            else if(x>val*55)
            {
                a=0x2dffffff;
            }
            else if(x>val*54)
            {
                a=0x2effffff;
            }
            else if(x>val*53)
            {
                a=0x2fffffff;
            }
            else if(x>val*52)
            {
                a=0x30ffffff;
            }
            else if(x>val*51)
            {
                a=0x31ffffff;
            }
            else if(x>val*50)
            {
                a=0x32ffffff;
            }

            else if(x>val*49)
            {
                a=0x33ffffff;
            }
            else if(x>val*48)
            {
                a=0x34ffffff;
            }
            else if(x>val*47)
            {
                a=0x35ffffff;
            }
            else if(x>val*46)
            {
                a=0x36ffffff;
            }
            else if(x>val*45)
            {
                a=0x37ffffff;
            }
            else if(x>val*44)
            {
                a=0x38ffffff;
            }
            else if(x>val*43)
            {
                a=0x39ffffff;
            }
            else if(x>val*42)
            {
                a=0x3affffff;
            }
            else if(x>val*41)
            {
                a=0x3bffffff;
            }
            else if(x>val*40)
            {
                a=0x3cffffff;
            }

            else if(x>val*39)
            {
                a=0x3dffffff;
            }
            else if(x>val*38)
            {
                a=0x3effffff;
            }
            else if(x>val*37)
            {
                a=0x3fffffff;
            }
            else if(x>val*36)
            {
                a=0x40ffffff;
            }
            else if(x>val*35)
            {
                a=0x41ffffff;
            }
            else if(x>val*34)
            {
                a=0x42ffffff;
            }
            else if(x>val*33)
            {
                a=0x43ffffff;
            }
            else if(x>val*32)
            {
                a=0x44ffffff;
            }
            else if(x>val*31)
            {
                a=0x45ffffff;
            }
            else if(x>val*30)
            {
                a=0x46ffffff;
            }

            else if(x>val*29)
            {
                a=0x47ffffff;
            }
            else if(x>val*28)
            {
                a=0x48ffffff;
            }
            else if(x>val*27)
            {
                a=0x49ffffff;
            }
            else if(x>val*26)
            {
                a=0x4affffff;
            }
            else if(x>val*25)
            {
                a=0x4bffffff;
            }
            else if(x>val*24)
            {
                a=0x4cffffff;
            }
            else if(x>val*23)
            {
                a=0x4dffffff;
            }
            else if(x>val*22)
            {
                a=0x4effffff;
            }
            else if(x>val*21)
            {
                a=0x4fffffff;
            }
            else if(x>val*20)
            {
                a=0x50ffffff;
            }

            else if(x>val*19)
            {
                a=0x51ffffff;
            }
            else if(x>val*18)
            {
                a=0x52ffffff;
            }
            else if(x>val*17)
            {
                a=0x53ffffff;
            }
            else if(x>val*16)
            {
                a=0x54ffffff;
            }
            else if(x>val*15)
            {
                a=0x55ffffff;
            }
            else if(x>val*14)
            {
                a=0x56ffffff;
            }
            else if(x>val*13)
            {
                a=0x57ffffff;
            }
            else if(x>val*12)
            {
                a=0x58ffffff;
            }
            else if(x>val*11)
            {
                a=0x59ffffff;
            }
            else if(x>val*10)
            {
                a=0x5affffff;
            }

            else if(x>=val*9)
            {
                a=0x5bffffff;
            }
            else if(x>=val*8)
            {
                a=0x5cffffff;
            }
            else if(x>=val*7)
            {
                a=0x5dffffff;
            }
            else if(x>=val*6)
            {
                a=0x5effffff;
            }
            else if(x>=val*5)
            {
                a=0x5fffffff;
            }
            else if(x>=val*4)
            {
                a=0x60ffffff;
            }
            else if(x>=val*3)
            {
                a=0x61ffffff;
            }
            else if(x>=val*2)
            {
                a=0x62ffffff;
            }
            else if(x>=val*1)
            {
                a=0x63ffffff;
            }
            else if(x>=val*0)
            {
                a=0x64ffffff;
            }
            pix[x]=pix[x] & a;
        }

        newBitmap.setPixels(pix,0, w, 0, 0, w, h);

到这里就结束了,这是java版的,如果是批量处理,建议还是使用jni处理,这个以后实现了再发表

 

参考::https://blog.csdn.net/w855227/article/details/79359435

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值