zoukankan      html  css  js  c++  java
  • AndroidのBitmap之大图片优化

    不解释大家懂得,在listview 或grid或viewpager等大量大尺寸图片时,会造成OOM

    这里是优化图片内存的一个方法,注释写的很 明确..

    public Bitmap getBitmapFromNet(final String url,final int width,final int height){//从网络下载图片
            try {
                
                //图片内存算法
                //width*height*Config(480*320*ARGB_8888)——>480*320*4 byte
                
                BitmapFactory.Options opt = new BitmapFactory.Options();
                
                /*组合使用*/
                opt.inPurgeable = true;
                opt.inInputShareable = true;
                
                opt.inPreferredConfig = Bitmap.Config.RGB_565;
                
                opt.outWidth = width;
                opt.outHeight = height;
                opt.inJustDecodeBounds = true;//设置为true将不会返回真正图片
                
                int yRatio = (int)Math.ceil(opt.outHeight/height);  
                int xRatio = (int)Math.ceil(opt.outWidth/width);  
                   
                if (yRatio > 1 || xRatio > 1){  
                 if (yRatio > xRatio) {  
                  opt.inSampleSize = yRatio;   //缩放值
                 }  
                 else {  
                  opt.inSampleSize = xRatio;    
                 }  
                }  
                //忘了加上这句(重要)
                opt.inJustDecodeBounds = false;//还原图片
                
                Bitmap bitmap = BitmapFactory.decodeStream(new URL(url).openStream(),null,opt);
                //bitmap = Bitmap.createScaledBitmap(bitmap, width, height, true);
                cache.put(url, new SoftReference<Bitmap>(bitmap));//保存缓存--------->缓存Map
                return bitmap;
            } catch (MalformedURLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            
            return null;
        }

    按照我以上的代码是获取不到图片的,

    不好意识,忘了加一句,opt.inJustDecodeBounds = false;这句得放在opt.inSampleSize = yRatio; 后面。

    只有把缩放值设定好了以后,再把inJustDecodeBounds属性设置为false,因为先把inJustDecodeBounds设为true,此时返回的bitmap为null,但是保存了原始图片的大小。

    inSampleSize缩放值设置好了,option就会根据原来的尺寸缩小,然后把再把inJustDecodeBounds设为false的时候,这时就会返回按缩放值缩小后的图片返回到bitmap。

  • 相关阅读:
    Object-c的类可以多重继承么?可以实现多个接口么?如何实现?
    对于TableViewCell重用机制的理解
    xcode快捷方式
    Mysql数据迁移——按分号split一列字段插入另一张表
    Android手机导出微信聊天记录
    Java性能分析工具之Jprofiler初体验
    Android adb端口被占用的解决办法
    mysql limit查询性能优化
    Delphi异或算法转换为java实现
    [python]用Python进行SQLite数据库操作
  • 原文地址:https://www.cnblogs.com/bvin/p/2851626.html
Copyright © 2011-2022 走看看