android 下图片的Bitmap.compress()占用内存的大小分析

       上次研究了安卓下面图片通过缩放改变大小,这个变化是非常明显,但是失帧的情况也挺严重,这次主要是研究一下如何在不失帧的情况下压缩图片,

     一、基础知识

           1.1如果使用BitmapFactory.decodeResource()图片后会对图片进行缩放,造成图片变大的问题

                   图片在windows下显示大小为大概是374k(374,077 字节),在通过BitmapFactory.decodeResource()加载后分为以下两种情况

                  1.1.1、如果options.inScaled=false;表示使用原图大小,在内存中占用的空间是3.68M(3686400字节)

                  1.1.2、如果使用options.inScaled=true;则安卓系统会根据当前所在的hdpi中用到的比例,对图片进行缩放,如果图片小于当前的尺寸则会放大,如果大於则会缩小,这样子小的图片会被放大8.29M(8294400)

         1.2 举例说明:

                  我的图片在windows上显示为374k字节,宽为720,高为1280,如果放到了xhdpi文件夹下,如果使用第一种宽度和高度不变,占用内存3.68M,如果使用第二种方法,宽为1080,高为1920,大小为8.29M,这也和手机的分辨率有关系。

这是根据options.inScaled=true时,对图片进行缩放时的对比

图片格式 图片存储大小 图片宽和高 手机mDensity 存放位置 安卓中分配内存大小
jpg 365k 720*1280 320 xhdpi 720*1280 3,686,400
jpg 365k 720*1280 480 xhdpi 1080*1920 8,294,400
           

     二、压缩算法(compress压缩是存储压缩,不是内存压缩,所以在内存中并没有改变大小)

           2.1、使用Bitmap.compress()进行压缩,压缩的格式为PNG,如果图片质量是60大小为2.3M,如果质量是20大小为1.3M

           2.2、使用Bitmap.compress()进行压缩,压缩的格式为JPEG,如果图片质量是60大小为98.6K

所以目前得出的结论是质量压缩对于内存来说是没有用的

 

   三、 android studio 图片内存占用分析

 下面是我对这个jpg图片的内存监控,这个图片是放到了一个ImageQualityActivity类中,然后在初始化时加载图片,我一共点了三次ImageQualityActivity的打开,并点击了返回按钮 ,并在onDestroy中调用了图片的回收方法,可是监控到仍然是三个图片,在内存中并没有立即回收(将不用的对象显式地设为null,有利于GC收集器判定垃圾,从而提高了GC的效率),这应该涉及到安卓的回收算法。需要到一定内存数量才去回收。

  BitmapFactory.Options options = new BitmapFactory.Options();
            //设置压缩的尺寸,值为2的幂次方,如果为1表示不压缩
            options.inSampleSize = 1;

            tagBitmap = BitmapFactory.decodeStream(getAssets().open("bg"), null, options);
            ByteArrayOutputStream stream = new ByteArrayOutputStream();


            tagBitmap.compress(Bitmap.CompressFormat.JPEG, 60, stream);
            tagBitmap.recycle();

回收图片的代码段

   @Override
    protected void onDestroy() {
        tagBitmap=null;
        super.onDestroy();
    }

 

  四、android下的内存优化

      只能在加载图片时的Options上下功夫了

一、如果图片非常大,建议还是先进行绽放吧,这个毕竟是改变图片最有效的方法了

    //设置压缩的尺寸,值为2的幂次方,如果为1表示不压缩
            options.inSampleSize = 1;

         二、如果自己知道图片的大小(比如资源文件),并且不是很大,Options.inScaled=false,这样子,可以避免根据手机的不同来自动缩放在内存中的大小,

 

 

 

 

 

参考:

https://segmentfault.com/q/1010000007053170/a-1020000007074735

内存分析工具http://www.cnblogs.com/keke-xiaoxiami/p/6187864.html

图片查看工具https://www.jianshu.com/p/cdf185ca9045

Bitmap为null的描述https://blog.csdn.net/a2241076850/article/details/52221701

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章