Bitmaps与其优化

原创 2016年05月30日 15:04:47

一, 位图重新采样

1, 有效的处理较大的位图

图像有各种不同的形状和大小。在很多情况下,他们往往比一个典型应用程序的用户界面(UI)所需要的资源更大。

读取一个位图的尺寸和类型:
  为了从多种资源来创建一个位图,BitmapFactory类提供了几个解码的方法(decodeByteArray(), decodeFile(), decodeResource(), 等等) 。根据你的图像数据资源选择最合适的解码方法。这些方法试图请求分配内存来构造位图,因此很容易导致OutOfMemory异常。每种类型的解码方法都有额外的特征可以让你通过BitMapFactory.Options类指定解码选项。当解码时避免内存分配可以设置inJustDecodeBounds属性为true, 位图对象返回null但是设置了outWidth, outHeight和outMimeType。这种技术允许你在创建位图(和分配内存) 之前去读取图像的尺寸和类型。

示例:加载一个缩小版本到内存中:
这里写图片描述

2, 缓存位图

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

注: 我们可以引用第三方的包, xUtils来实现上述功能
http://blog.csdn.net/u013144863/article/details/51476503


public class MainActivity extends AppCompatActivity {

    private ImageView imageView;
    private LruCache<String, Bitmap> lruCache;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        imageView = (ImageView) findViewById(R.id.imageView);


        //获取当前activity内存大小, 谷歌默认为16M
        ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
        int memoryClass = am.getMemoryClass();

        final int cacheSize = memoryClass / 8 * 1024 * 1024;//单位为字节  (1/8的内存作为缓存大小, 通常)
        lruCache = new LruCache<>(cacheSize);
    }

    //往缓存中存
    public void addBitmapToCache(String key, Bitmap bitmap) {
        if (getBitmapFromCache(key) == null) {
            lruCache.put(key, bitmap);
        }
    }

    //从缓存中读取方法
    public Bitmap getBitmapFromCache(String key) {
        return lruCache.get(key);
    }


    /**
     * 位图重新采样
     *
     * @param res
     * @param resId
     * @param reqWidth
     * @param reqHeight
     * @return
     */
    public Bitmap decodeSamleBitmapFromResource(Resources res, int resId, int reqWidth, int reqHeight) {
        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;
        BitmapFactory.decodeResource(res, resId, options);
        options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);
        options.inJustDecodeBounds = false;
        return BitmapFactory.decodeResource(res, resId, options);

    }

    public void showPicture(View view) {



        String key = String.valueOf(R.drawable.img23);
        //第一次执行时位图放入缓存中, 以后再执行时就不用再从网上或者本地获取了!
        Bitmap bitmap = getBitmapFromCache(key);
        if (bitmap == null) {
            bitmap = decodeSamleBitmapFromResource(getResources(), R.drawable.img23, 50, 50);
            addBitmapToCache(key, bitmap);
        } else {
            System.out.println("lruCache 中有位图");
        }


        imageView.setImageBitmap(bitmap);
    }

    /**
     * 计算位图的采样比例
     *
     * @param options
     * @param reqWidth
     * @param reqHeight
     * @return
     */
    public int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) {
        //获取位位图的原宽高
        int w = options.outWidth;
        int h = options.outHeight;
        //假设先让其为1
        int inSampSize = 1;

        //原来的图片比你想要的图片大
        if (w > reqWidth || h > reqHeight) {
            if (w > h) {
                inSampSize = Math.round((float) h / (float) reqHeight);
            } else {
                inSampSize = Math.round((float) w / (float) reqWidth);
            }
        }


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

redis bitmaps(译文)

Bitmaps原链接请猛戳这里bitmaps不是一种实际的数据类型,本质上说,它是定义在字符串类型上的一组位操作方法。单个bitmaps的最大长度是512MB,即2^32个比特位。有两种类型的位操作:...
  • qmhball
  • qmhball
  • 2016年08月31日 11:37
  • 710

Redis-Bitmaps应用

Redis-Bitmaps应用 一.数据结构模型 Redis提供的Bitmaps这个“数据结构”可以实现对位的操作。Bitmaps本身不是一种数据结构,实际上就是字符串,但是它可以对字符串的位进行操作...
  • sunhuiliang85
  • sunhuiliang85
  • 2017年07月11日 15:49
  • 1183

Powershell远程在Azure A7虚拟机运行Java JVM失败

Error occurred during initialization of VM Unable to allocate 458752KB bitmaps for parallel garbage...
  • quicknet
  • quicknet
  • 2014年06月11日 10:02
  • 3846

Android4.1.1引起Cannot draw recycled bitmaps

在android4.1.1上运行以前写的程序,出现如下异常: java.lang.IllegalArgumentException: Cannot draw recycled bitmapsat a...
  • lquanshui
  • lquanshui
  • 2012年11月28日 19:17
  • 6084

Android中Cannot draw recycled bitmaps

java.lang.IllegalArgumentException: Cannot draw recycled bitmapsat android.view.GLES20Canvas.drawBit...
  • yaya_soft
  • yaya_soft
  • 2015年04月27日 10:01
  • 1287

Redis Bitmaps简介

Redis Bitmaps简介Bitmaps并不是实际的数据类型,而是定义在String类型上的一个面向字节操作的集合。因为字符串是二进制安全的块,他们的最大长度是512M,最适合设置成2^32个不同...
  • iycynna_123
  • iycynna_123
  • 2017年05月09日 08:55
  • 1057

roaringbitmap 源码(4)序列化和反序化以及分布式应用

迭代器和序列化和反序列化serialize:都很简单。 ArrayContainer@Override public void serialize(DataOutput out) throws IO...
  • chenfenggang
  • chenfenggang
  • 2017年07月08日 15:03
  • 556

Mark-and-Sweep Garbage Collection

http://www.brpreiss.com/books/opus5/html/page424.html void mark (Object p) if (!p.marked...
  • robert198837
  • robert198837
  • 2014年10月25日 08:25
  • 567

如何分析java.lang.IllegalArgumentException: Cannot draw recycled bitmaps异常

[DESCRIPTION]   如何分析java.lang.IllegalArgumentException: Cannot draw recycled bitmaps异常   ...
  • wds1181977
  • wds1181977
  • 2016年03月02日 09:32
  • 891

Bitmaps

BitmapsThe bitmapped image, or simply bitmap, is a staple of modern computer graphics because it all...
  • lemonade
  • lemonade
  • 2001年06月02日 09:40
  • 1793
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Bitmaps与其优化
举报原因:
原因补充:

(最多只允许输入30个字)