`
bdql
  • 浏览: 49765 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Bitmaps 的重要有效方法 之一

 
阅读更多

我们都知道BitmapFactory类提供几种解码方法 (decodeByteArray()、 decodeFile()、 decodeResource()等) 从各种来源中创建一个Bitmap。选择最合适的解码方法基于您的图像数据源。这些方法尝试为构造位图分配内存,因此可以很容易有OutOfMemory异常的结果。

java.lang.OutofMemoryError: bitmap size exceeds VM budget.这种蛋疼的问题是因为CCD对每个android应用有内存限制16M,现在放宽了,但是如果把十几兆的图片直接显示出来那肯定是要挂滴。
怎么办咧?压缩小了的显示吧。

BitmapFactory.Options是关键

具体的做法是用两次解码!
第一次解码,其目的是测量尺寸,如果oom了也没关系
然后计算压缩比例
第二次解码,变小了
public static int calculateInSampleSize(
            BitmapFactory.Options options, int reqWidth, int reqHeight) {
    // Raw height and width of image
    final int height = options.outHeight;
    final int width = options.outWidth;
    int inSampleSize = 1;

    if (height > reqHeight || width > reqWidth) {

        // Calculate ratios of height and width to requested height and width
        final int heightRatio = Math.round((float) height / (float) reqHeight);
        final int widthRatio = Math.round((float) width / (float) reqWidth);

        // Choose the smallest ratio as inSampleSize value, this will guarantee
        // a final image with both dimensions larger than or equal to the
        // requested height and width.
        inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
    }

    return inSampleSize;
}

注:inSampleSize值是2 的幂。
inJustDecodeBounds设置为true

public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId,
        int reqWidth, int reqHeight) {
    Bitmap bm = null;
    // First decode with inJustDecodeBounds=true to check dimensions
    final BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = true;
    try {
        BitmapFactory.decodeResource(res, resId, options);
    } catch (OutOfMemoryError e) {
        System.gc();
    }

    // Calculate inSampleSize
    options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);

    // Decode bitmap with inSampleSize set
    options.inJustDecodeBounds = false;
    try {
        bm = BitmapFactory.decodeResource(res, resId, options);
    } catch (OutOfMemoryError e) {
         System.gc();
    }
    return bm;
}

这种方法容易地将任意大小的位图加载到显示 100 x 100 像素的缩略图,如下面的代码示例所示:
mImageView.setImageBitmap(
    decodeSampledBitmapFromResource(getResources(), R.id.myimage, 100, 100));


 

分享到:
评论

相关推荐

    Android应用源码之(动态位图).zip

    在Android应用开发中,动态位图(Dynamic Bitmaps)是一个重要的概念,特别是在处理图像资源、动画或者游戏场景时。这份"Android应用源码之(动态位图).zip"的压缩包很可能包含了一些示例代码,用于展示如何在Android...

    redis攻击还原

    首先,文档指出Redis攻击的原理之一在于其默认配置并不安全,特别在未设置密码认证的情况下,任何知道Redis服务所在IP和端口的人都可以直接进行读写操作。例如,攻击者可以使用Redis的“CONFIG”命令来获取服务器...

    用c++进行数字图像处理

    本部分将详细探讨BMP文件格式,这是Windows操作系统中最常用的图像存储格式之一,也是数字图像处理中不可忽视的一个重要知识点。 BMP文件格式,全称为Bitmap File Format,它是一种标准的位图图像文件格式,被...

    GIS图标

    GIS图标是GIS系统中的一个重要组成部分,它们通常用来表示地图上的特定对象或地理实体,如城市、河流、建筑物等。MapObject是GIS领域中的一个关键概念,它是一个可以与地图交互的图形对象,用于在地图上显示和操作...

    linux-2.6.29在mini2440上的内存底层初始化学习笔记

    Buddy系统的初始化是内存管理系统的关键部分之一,它确保了内存资源的有效分配和回收。 - **初始化步骤**: - 为每个ZONE初始化对应的buddy system。 - 创建所需的bitmaps,并设置初始状态。 - 定义和配置分配与...

    PHP使用Redis替代文件存储Session的方法

    在Web开发过程中,Session管理是保证用户体验和安全性的关键技术之一。在PHP开发环境中,默认情况下Session数据是存储在服务器的文件系统中的。随着业务访问量的增大,文件存储方式在高并发的情况下效率不高,容易...

    窗口应用程序_窗口应用程序

    窗口是GWES中最基本的UI元素之一,具有以下特点: - **矩形形状**:所有窗口都是矩形。 - **Z-Order(叠置顺序)**:窗口按照一定的顺序排列在屏幕上,决定了它们的可见性。位于前面的窗口可能会遮挡后面的窗口。 -...

    0开篇:授人以鱼不若授人以渔 —— Redis 可以用来做什么?.md

    Redis是一种开源的内存中数据结构存储系统,通常被用作数据库、缓存和消息代理。它支持多种类型的数据结构,如字符串(strings)、哈希...对于后端开发者而言,掌握Redis的工作原理和最佳实践是必备的技能之一。

    ext4英文API

    Ext4是Linux操作系统中广泛使用的文件系统之一,它在2008年由Linux内核社区引入,以替代早期的ext3。ext4英文API是指用于与ext4文件系统交互的编程接口,通常由C语言编写,是Linux内核开发者和系统管理员进行文件...

    redis最新3.0版本

    Redis 3.0版本是其发展历程中的一个重要里程碑,它带来了许多改进和新特性,旨在提升性能、稳定性和功能多样性。 在Redis 3.0中,主要关注以下几个方面的更新: 1. **多线程I/O**: 以往的Redis版本是单线程模型,...

    布局渲染流程

    - **减轻CPU负担**:通过将显示任务交给GPU处理,可以有效减轻CPU的负担,使其专注于其他更重要的任务。 #### 三、60Hz刷新频率的实现 ##### 1. **60Hz的意义** Android系统为了确保用户界面的流畅性,采用了60...

    海量数据OLAP分析实践-TD Atom Cube

    ### 海量数据OLAP分析实践-TD Atom Cube #### MOLAP技术特点与应用场景 在探讨TD Atom Cube之前,我们首先需要理解MOLAP...通过对核心组件的不断优化和完善,TD Atom Cube有望成为大数据分析领域的重要工具之一。

    redis实战 红豆出品 兄弟连redis

    它支持存储的值包括字符串(strings)、哈希(hashes)、列表(lists)、集合(sets)、有序集合(sorted sets)、位图(bitmaps)、超日志(hyperloglogs)、地理空间索引(geospatial indexes)等数据类型,适用...

    60道关于Redis的常见面试题.pdf

    - **定义**:Sentinel 是 Redis 的高可用方案之一,主要用于监控主服务器的状态、在主服务器故障时自动转移从服务器为新的主服务器,并通知客户端。 - **配置和使用**: - 在`sentinel.conf`配置文件中指定监控的主...

    WinRAR_4.0.exe

    令是一个字符串(或单个的字母),命令 RAR 去执行一个相应的操作。开关被用来 改变 RAR 执行操作的方法。其它参数是压缩文件名和被压缩的文件或要从压缩文件 中被解压文件。 列表文件是一个包括处理的文件名的纯...

    java开源包11

    jaev 是一个用来验证电子邮箱地址是否有效的 Java 项目。 Java的FastCGI网关 jFastCGI jFastCGI 是一个可以让Tomcat 之类的Servlet容器支持运行PHP和其它fastcgi应用程序,将Servlet容器充当成一个FastCGI 的网关。...

    VC资源分配以及释放一览表

    在Visual C++(简称VC)开发环境中,资源管理是确保程序稳定性和性能的关键因素之一。不合理的资源管理可能导致内存泄漏、资源占用过高乃至程序崩溃等问题。本文将根据提供的资源分配及释放一览表,详细解析其中涉及...

    JAVA上百实例源码以及开源项目源代码

    在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存中清除…… Java Socket 聊天...

Global site tag (gtag.js) - Google Analytics