Bitmap的复制和软引用

Bitmap是不能通过“ A = B ”来传递的,这样只是把B的引用给了A而已 

复制有两个方法: 
第一:copy方法: 
根据该位图的大小产生一个新位图,根据指定的结构设置新位图的结构,然后把位图的像素拷贝到新位图中。如果不支持该转换,或者分配内存失败,那就返回NULL。返回的位图和原图有同样的像素密度。 
参数 
  config   结果图预期的结构; 
  isMutable   如果是true,那么产生的图片是可变的。(比如,它的像素能被修改) 
  返回值 新的位图。如果拷贝操作不能执行,则返回NULL。 
  

Bitmap alterBitmap=screenBmp.copy(Bitmap.Config.ARGB_8888, true);
  • ALPHA_8就是Alpha由8位组成 

ARGB_4444就是由4个4位组成即16位, 
ARGB_8888就是由4个8位组成即32位, 
RGB_565就是R为5位,G为6位,B为5位共16位


第二:新建空白bitmap,然后绘制(优点:可以进行自定义的处理

//创建原图的一个副本。 可修改  创建的是一个空白的图形。
        Bitmap alterBitmap = Bitmap.createBitmap(screenBmp.getWidth() * 2, screenBmp.getHeight() * 2, screenBmp.getConfig());
        //1.准备一个画板  在上面放上准备好的 空白的位图
        Canvas canvas = new Canvas(alterBitmap);
        //2.准备一个画笔
        Paint paint = new Paint();
        paint.setColor(Color.BLACK);
        //3.画画
        Matrix m = new Matrix();
        m.setScale(2.0f, 2.0f);
        canvas.drawBitmap(screenBmp, m, paint);

首先定义一个HashMap,保存软引用对象。

private Map<String, SoftReference<Bitmap>> imageCache = new HashMap<String, SoftReference<Bitmap>>();

再来定义一个方法,保存Bitmap的软引用到HashMap。

    public void addBitmapToCache(String path) {

        // 强引用的Bitmap对象

        Bitmap bitmap = BitmapFactory.decodeFile(path);

        // 软引用的Bitmap对象

        SoftReference<Bitmap> softBitmap = new SoftReference<Bitmap>(bitmap);

        // 添加该对象到Map中使其缓存

        imageCache.put(path, softBitmap);

    }

    获取的时候,可以通过SoftReference的get()方法得到Bitmap对象。

    public Bitmap getBitmapByPath(String path) {

        // 从缓存中取软引用的Bitmap对象

        SoftReference<Bitmap> softBitmap = imageCache.get(path);

        // 判断是否存在软引用

        if (softBitmap == null) {

            return null;

        }

        // 取出Bitmap对象,如果由于内存不足Bitmap被回收,将取得空

        Bitmap bitmap = softBitmap.get();

        return bitmap;

    }

使用软引用以后,在OutOfMemory异常发生之前,这些缓存的图片资源的内存空间可以被释放掉的,从而避免内存达到上限,避免Crash发生。

需要注意的是,在垃圾回收器对这个Java对象回收前,SoftReference类所提供的get方法会返回Java对象的强引用,一旦垃圾线程回收该Java对象之后,get方法将返回null。所以在获取软引用对象的代码中,一定要判断是否为null,以免出现NullPointerException异常导致应用崩溃。

猜你喜欢

转载自blog.csdn.net/boguesfei/article/details/81735877