码迷,mamicode.com
首页 > 移动开发 > 详细

Android之Bitmap图片的截屏、模糊处理、传递、使用

时间:2015-08-19 20:36:45      阅读:212      评论:0      收藏:0      [点我收藏+]

标签:android   截屏   bitmap   高斯模糊   

项目中遇到了这样一个需求:

当某个条件满足时就截取当前屏幕,并跳转到另外一个页面,同时将这个截屏图片作为下一个页面的背景图片,同时背景图片需要模糊处理

接下来就一步一步解决问题:

1、截取无状态栏的当前屏幕图片,请参考takeScreenShot方法

2、使图片高斯模糊的方法请参考blurBitmap方法

      注意:RenderScript是Android在API 11之后加入的,用于高效的图片处理,包括模糊、混合、矩阵卷积计算等

public class ScreenShotUtil {

    // 获取指定Activity的截屏,保存到png文件
    String filenameTemp = "/mnt/sdcard/temp";

    /**
     * takeScreenShot:
     * TODO 截屏    去掉标题栏
     * @param activity
     */
    public static Bitmap takeScreenShot(Activity activity) {
        // View是你需要截图的View
        View view = activity.getWindow().getDecorView();
        view.setDrawingCacheEnabled(true);
        view.buildDrawingCache();
        Bitmap b1 = view.getDrawingCache();

        // 获取状态栏高度
        Rect frame = new Rect();
        activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);
        int statusBarHeight = frame.top;
        LogHelper.i("TAG", "" + statusBarHeight);

        // 获取屏幕长和高
        int width = activity.getWindowManager().getDefaultDisplay().getWidth();
        int height = activity.getWindowManager().getDefaultDisplay().getHeight();
        // 去掉标题栏
        // Bitmap b = Bitmap.createBitmap(b1, 0, 25, 320, 455);
        Bitmap b = Bitmap.createBitmap(b1, 0, statusBarHeight, width, height - statusBarHeight);
        view.destroyDrawingCache();
        return b;
    }

    /**
     * TODO  用于高效的图片处理,包括模糊、混合、矩阵卷积计算等
     * @param bitmap
     * @param context
     */
    @SuppressLint("NewApi")
    public static Bitmap blurBitmap(Bitmap bitmap, Context context) {

        // 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(),
                Config.ARGB_8888);

        // Instantiate a new Renderscript
        RenderScript rs = RenderScript.create(context);//RenderScript是Android在API 11之后加入的

        // 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;

    }
}

3、传递bitmap

刚开始我是这么传递的

bundle.putParcelable("bitmap", ScreenShotUtil.takeScreenShot(theLayout.getActivity()));

继续下面操作:就是将bitmap封装到bundle中,然后封装到intent中启动下一个Activity

ActivityUtil.startActivity(theLayout.getActivity(), LiveEndActivity.class, bundle, false);

/**
     * 开启另外一个activity
     * 
     * @param activity
     * @param cls 另外的activity类
     * @param bundle 传递的bundle对象
     * @param isFinish true表示要关闭activity false表示不要关闭activity
     */
    public static void startActivity(Activity activity, Class<?> cls, Bundle bundle, boolean isFinish) {
        Intent intent = new Intent(activity, cls);
        if (bundle != null) {
            intent.putExtras(bundle);
        }
        activity.startActivity(intent);
        if (isFinish) {
            activity.finish();
        }
        activity.overridePendingTransition(R.anim.push_left_in, R.anim.push_left_out);
    }
然后在LiveEndActivity中这么解析
Bitmap bitmap = intent.getExtras().getParcelable("bitmap");
结果:无法得到预期效果

关键是不报错,debug的时候可以看到我们的确截屏成功,但是Bitmap对象就是没有传递过去,而且不是启动下一个Activity

然后去网上找方法调研

结论:不能直接传递大于40k的图片

解决办法:把bitmap存储为byte数组,然后再继续传递

       Bitmap bitmap = ScreenShotUtil.takeScreenShot(theLayout.getActivity());
       ByteArrayOutputStream baos=new ByteArrayOutputStream();  
       bitmap.compress(Bitmap.CompressFormat.PNG, 100, baos);  
       byte [] bitmapByte =baos.toByteArray();  
       bundle.putByteArray("bitmap", bitmapByte);
       // bundle.putParcelable("bitmap", ScreenShotUtil.takeScreenShot(theLayout.getActivity()));
                   
       ActivityUtil.startActivity(theLayout.getActivity(), LiveEndActivity.class, bundle, false);

然后在下一个Activity中这么解析

 byte[] bis =intent.getExtras().getByteArray("bitmap");
            Bitmap bitmap=BitmapFactory.decodeByteArray(bis, 0, bis.length); 

4、假如我们需要将这张图片设置为我们当前Activity的背景图片,我们可以这么做

 if (bitmap != null) {
       bitmap = ScreenShotUtil.blurBitmap(bitmap,getApplicationContext());//高斯模糊处理
       getWindow().getDecorView().setBackgroundDrawable(new BitmapDrawable(bitmap));
 }

问题基本解决了,觉得有用的可以参考一下!


版权声明:本文为博主原创文章,未经博主允许不得转载。

Android之Bitmap图片的截屏、模糊处理、传递、使用

标签:android   截屏   bitmap   高斯模糊   

原文地址:http://blog.csdn.net/s003603u/article/details/47783997

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!