android 高斯模糊处理的简单使用

来源:互联网 发布:u盘启动安装ubuntu系统 编辑:程序博客网 时间:2024/04/29 11:33
<span style="color: rgb(34, 34, 34); font-family: 'Helvetica Neue', 'Hiragino Sans GB', 'Microsoft YaHei', 黑体, Arial, sans-serif; font-size: 14px; line-height: 22.3999996185303px;">android 高斯模糊处理的简单使用</span><br style="color: rgb(34, 34, 34); font-family: 'Helvetica Neue', 'Hiragino Sans GB', 'Microsoft YaHei', 黑体, Arial, sans-serif; font-size: 14px; line-height: 22.3999996185303px;" /><br style="color: rgb(34, 34, 34); font-family: 'Helvetica Neue', 'Hiragino Sans GB', 'Microsoft YaHei', 黑体, Arial, sans-serif; font-size: 14px; line-height: 22.3999996185303px;" /><span style="color: rgb(34, 34, 34); font-family: 'Helvetica Neue', 'Hiragino Sans GB', 'Microsoft YaHei', 黑体, Arial, sans-serif; font-size: 14px; line-height: 22.3999996185303px;">先是按比例压缩,然后质量压缩 然后模糊处理,然后非空判断一直用  activity结束的时候recycle一下</span><br style="color: rgb(34, 34, 34); font-family: 'Helvetica Neue', 'Hiragino Sans GB', 'Microsoft YaHei', 黑体, Arial, sans-serif; font-size: 14px; line-height: 22.3999996185303px;" /><br style="color: rgb(34, 34, 34); font-family: 'Helvetica Neue', 'Hiragino Sans GB', 'Microsoft YaHei', 黑体, Arial, sans-serif; font-size: 14px; line-height: 22.3999996185303px;" /><span style="color: rgb(34, 34, 34); font-family: 'Helvetica Neue', 'Hiragino Sans GB', 'Microsoft YaHei', 黑体, Arial, sans-serif; font-size: 14px; line-height: 22.3999996185303px;">测试机,三星note3,新鲜出炉,还没测试低端机</span>
 
@Override    protected void onScrollChanged(int l, int t, int oldl, int oldt) {        super.onScrollChanged(l, t, oldl, oldt);        if (mTopView != null && mFlowView != null && mImageView != null && mHover != null) {            if (bitmap == null || bitmap.isRecycled()) {                drawable = (BitmapDrawable) mImageView.getDrawable();                bitmap = drawable.getBitmap();//   位图质量和大小压缩加高斯算法计算时间取决于手机的硬件,此处使用异步优化图片变化过程的卡顿现象//             bitmap = blurBitmap(bitmap);//                drawable = new BitmapDrawable(bitmap);                new task().execute(bitmap);            }            if (t >= mTopView.getHeight()) {                mFlowView.setVisibility(View.VISIBLE);            } else {                mFlowView.setVisibility(View.GONE);                if (t == 0) {                    mHover.setVisibility(View.INVISIBLE);                    mImageView.setAlpha(1f);                } else {                    mHover.setBackground(drawable);                    mHover.setVisibility(View.VISIBLE);                    mImageView.setAlpha(0x1.ccccccp-1f);//透明度.9f 编译器可选转换到16禁止,方便编译计算                }            }        }    }    class task extends AsyncTask<Bitmap, Void, Bitmap> {        @Override        protected Bitmap doInBackground(Bitmap... params) {            bitmap = drawable.getBitmap();            bitmap = blurBitmap(bitmap);            return bitmap;        }        @Override        protected void onPostExecute(Bitmap bitmap) {            super.onPostExecute(bitmap);            if (bitmap != null)                drawable = new BitmapDrawable(bitmap);            mHover.setBackground(drawable);        }    }    public void listenerFlowViewScrollState(View topView, View flowView, ImageView imgView, View hover) {        mTopView = topView;        mFlowView = flowView;        mImageView = imgView;        mHover = hover;    }    public Bitmap blurBitmap(Bitmap bitmap) {        //压缩到100k以下,大图片理论上只能压缩到尽量靠近100k        bitmap = comp(bitmap);        //下面是google源码, radius代表能压缩的最大模糊程度        //Let's create an empty bitmap with the same size of the bitmap we want to blur        Bitmap outBitmap = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_8888);        //Instantiate a new Renderscript        RenderScript rs = RenderScript.create(mContext);        //Create an Intrinsic Blur Script using the Renderscript        ScriptIntrinsicBlur blurScript = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs));        //Create the Allocations (in/out) with the Renderscript and the in/out bitmaps        Allocation allIn = Allocation.createFromBitmap(rs, bitmap);        Allocation allOut = Allocation.createFromBitmap(rs, outBitmap);        //Set the radius of the blur        blurScript.setRadius(25.f);        //Perform the Renderscript        blurScript.setInput(allIn);        blurScript.forEach(allOut);        //Copy the final bitmap created by the out Allocation to the outBitmap        allOut.copyTo(outBitmap);        //recycle the original bitmap        bitmap.recycle();        //After finishing everything, we destroy the Renderscript.        rs.destroy();        return outBitmap;    }    private Bitmap comp(Bitmap image) {        ByteArrayOutputStream baos = new ByteArrayOutputStream();        image.compress(Bitmap.CompressFormat.JPEG, 100, baos);        if (baos.toByteArray().length / 1024 > 1024) {//判断如果图片大于1M,进行压缩避免在生成图片(BitmapFactory.decodeStream)时溢出            baos.reset();//重置baos即清空baos            image.compress(Bitmap.CompressFormat.JPEG, 50, baos);//这里压缩50%,把压缩后的数据存放到baos中        }        ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());        BitmapFactory.Options newOpts = new BitmapFactory.Options();        //开始读入图片,此时把options.inJustDecodeBounds 设回true了        newOpts.inJustDecodeBounds = true;        Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, newOpts);        newOpts.inJustDecodeBounds = false;        int w = newOpts.outWidth;        int h = newOpts.outHeight;        //现在主流手机比较多是800*480分辨率,所以高和宽我们设置为        float hh = 800f;//这里设置高度为800f        float ww = 480f;//这里设置宽度为480f        //缩放比。由于是固定比例缩放,只用高或者宽其中一个数据进行计算即可        int be = 1;//be=1表示不缩放        if (w > h && w > ww) {//如果宽度大的话根据宽度固定大小缩放            be = (int) (newOpts.outWidth / ww);        } else if (w < h && h > hh) {//如果高度高的话根据宽度固定大小缩放            be = (int) (newOpts.outHeight / hh);        }        if (be <= 0)            be = 1;        newOpts.inSampleSize = be;//设置缩放比例        //重新读入图片,注意此时已经把options.inJustDecodeBounds 设回false了        isBm = new ByteArrayInputStream(baos.toByteArray());        bitmap = BitmapFactory.decodeStream(isBm, null, newOpts);        return compressImage(bitmap);//压缩好比例大小后再进行质量压缩    }    private Bitmap compressImage(Bitmap image) {        ByteArrayOutputStream baos = new ByteArrayOutputStream();        image.compress(Bitmap.CompressFormat.JPEG, 90, baos);//质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中        int options = 90;        while (baos.toByteArray().length / 1024 > 100) {  //循环判断如果压缩后图片是否大于100kb,大于继续压缩            baos.reset();//重置baos即清空baos            image.compress(Bitmap.CompressFormat.JPEG, options, baos);//这里压缩options%,把压缩后的数据存放到baos中            options -= 10;//每次都减少10        }        ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());//把压缩后的数据baos存放到ByteArrayInputStream中        Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null);//把ByteArrayInputStream数据生成图片        return bitmap;    }

0 0
原创粉丝点击