词Ci 图片同时设置亮度和模糊度

来源:互联网 发布:淘宝少女装 编辑:程序博客网 时间:2024/05/17 02:30

两个SeekBar 分别控制亮度和模糊度,因为对图片的操作还是比较耗时的,所以在SeekBar改变时记下位置,定下来后再进行操作。

 SeekBar seekBar1 = (SeekBar) view.findViewById(R.id.seekBar1);        seekBar1.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener()        {            /**             * 拖动条停止拖动的时候调用             */            @Override            public void onStopTrackingTouch(SeekBar seekBar)            {                drawPicture(bright, radius);            }            /**             * 拖动条开始拖动的时候调用             */            @Override            public void onStartTrackingTouch(SeekBar seekBar)            {            }            /**             * 拖动条进度改变的时候调用             */            @Override            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser)            {                bright = progress;            }        });        SeekBar seekBar2 = (SeekBar) view.findViewById(R.id.seekBar2);        seekBar2.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener()        {            /**             * 拖动条停止拖动的时候调用             */            @Override            public void onStopTrackingTouch(SeekBar seekBar)            {                drawPicture(bright, radius);            }            /**             * 拖动条开始拖动的时候调用             */            @Override            public void onStartTrackingTouch(SeekBar seekBar)            {            }            /**             * 拖动条进度改变的时候调用             */            @Override            public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser)            {                radius = progress;            }        });

这里没什么介绍的,关键就在drawPicture(bright, radius)方法里了。

@TargetApi(11)    private void drawPicture(int bright, int radius)    {        Bitmap bmp = Bitmap.createBitmap(srcBitmap.getWidth(), srcBitmap.getHeight(), Config.ARGB_8888);        try        {            int brightness = bright - 127;            ColorMatrix cMatrix = new ColorMatrix();            cMatrix.set(new float[] {1, 0, 0, 0, brightness, 0, 1, 0, 0, brightness,// 改变亮度                    0, 0, 1, 0, brightness, 0, 0, 0, 1, 0});            Paint paint = new Paint();            paint.setColorFilter(new ColorMatrixColorFilter(cMatrix));            Canvas canvas = new Canvas(bmp);            canvas.drawBitmap(srcBitmap, 0, 0, paint);            if (Build.VERSION.SDK_INT > 16)            {                RenderScript rs = RenderScript.create(getActivity());                Allocation overlayAlloc = Allocation.createFromBitmap(rs, bmp);                ScriptIntrinsicBlur blur = ScriptIntrinsicBlur.create(rs, overlayAlloc.getElement());                blur.setInput(overlayAlloc);                blur.setRadius(radius + 1);                blur.forEach(overlayAlloc);                overlayAlloc.copyTo(bmp);                rs.destroy();            }            else            {                // 低版本的折衷处理方法                bmp = Fastblur.fastblur(mContext, bmp, radius);            }        }        catch (Exception e)        {            Log.e("ChangePicture", "drawPictureError");        }        destBitmap = bmp;        content.setBackgroundDrawable(new BitmapDrawable(getResources(), bmp));    }

先new了一个位图bmp,并用来初始化Cavas,再设置画笔的亮度,用paint把原图根据亮度画到Cavas上,canvas.drawBitmap(srcBitmap, 0, 0, paint);

再只需要对bmp设置模糊度就行了,可使用ScriptIntrinsicBlur,不过要在SDK>16才能使用,不过还有搜到一个低版本折衷处理方法,直接处理像素点的,可以自己下载代码去看,或网上搜索,这里就不介绍了(因为也不是太懂)。


0 0
原创粉丝点击