我们都知道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应用开发中,动态位图(Dynamic Bitmaps)是一个重要的概念,特别是在处理图像资源、动画或者游戏场景时。这份"Android应用源码之(动态位图).zip"的压缩包很可能包含了一些示例代码,用于展示如何在Android...
首先,文档指出Redis攻击的原理之一在于其默认配置并不安全,特别在未设置密码认证的情况下,任何知道Redis服务所在IP和端口的人都可以直接进行读写操作。例如,攻击者可以使用Redis的“CONFIG”命令来获取服务器...
本部分将详细探讨BMP文件格式,这是Windows操作系统中最常用的图像存储格式之一,也是数字图像处理中不可忽视的一个重要知识点。 BMP文件格式,全称为Bitmap File Format,它是一种标准的位图图像文件格式,被...
GIS图标是GIS系统中的一个重要组成部分,它们通常用来表示地图上的特定对象或地理实体,如城市、河流、建筑物等。MapObject是GIS领域中的一个关键概念,它是一个可以与地图交互的图形对象,用于在地图上显示和操作...
Buddy系统的初始化是内存管理系统的关键部分之一,它确保了内存资源的有效分配和回收。 - **初始化步骤**: - 为每个ZONE初始化对应的buddy system。 - 创建所需的bitmaps,并设置初始状态。 - 定义和配置分配与...
在Web开发过程中,Session管理是保证用户体验和安全性的关键技术之一。在PHP开发环境中,默认情况下Session数据是存储在服务器的文件系统中的。随着业务访问量的增大,文件存储方式在高并发的情况下效率不高,容易...
窗口是GWES中最基本的UI元素之一,具有以下特点: - **矩形形状**:所有窗口都是矩形。 - **Z-Order(叠置顺序)**:窗口按照一定的顺序排列在屏幕上,决定了它们的可见性。位于前面的窗口可能会遮挡后面的窗口。 -...
Redis是一种开源的内存中数据结构存储系统,通常被用作数据库、缓存和消息代理。它支持多种类型的数据结构,如字符串(strings)、哈希...对于后端开发者而言,掌握Redis的工作原理和最佳实践是必备的技能之一。
Ext4是Linux操作系统中广泛使用的文件系统之一,它在2008年由Linux内核社区引入,以替代早期的ext3。ext4英文API是指用于与ext4文件系统交互的编程接口,通常由C语言编写,是Linux内核开发者和系统管理员进行文件...
Redis 3.0版本是其发展历程中的一个重要里程碑,它带来了许多改进和新特性,旨在提升性能、稳定性和功能多样性。 在Redis 3.0中,主要关注以下几个方面的更新: 1. **多线程I/O**: 以往的Redis版本是单线程模型,...
- **减轻CPU负担**:通过将显示任务交给GPU处理,可以有效减轻CPU的负担,使其专注于其他更重要的任务。 #### 三、60Hz刷新频率的实现 ##### 1. **60Hz的意义** Android系统为了确保用户界面的流畅性,采用了60...
### 海量数据OLAP分析实践-TD Atom Cube #### MOLAP技术特点与应用场景 在探讨TD Atom Cube之前,我们首先需要理解MOLAP...通过对核心组件的不断优化和完善,TD Atom Cube有望成为大数据分析领域的重要工具之一。
它支持存储的值包括字符串(strings)、哈希(hashes)、列表(lists)、集合(sets)、有序集合(sorted sets)、位图(bitmaps)、超日志(hyperloglogs)、地理空间索引(geospatial indexes)等数据类型,适用...
- **定义**:Sentinel 是 Redis 的高可用方案之一,主要用于监控主服务器的状态、在主服务器故障时自动转移从服务器为新的主服务器,并通知客户端。 - **配置和使用**: - 在`sentinel.conf`配置文件中指定监控的主...
令是一个字符串(或单个的字母),命令 RAR 去执行一个相应的操作。开关被用来 改变 RAR 执行操作的方法。其它参数是压缩文件名和被压缩的文件或要从压缩文件 中被解压文件。 列表文件是一个包括处理的文件名的纯...
jaev 是一个用来验证电子邮箱地址是否有效的 Java 项目。 Java的FastCGI网关 jFastCGI jFastCGI 是一个可以让Tomcat 之类的Servlet容器支持运行PHP和其它fastcgi应用程序,将Servlet容器充当成一个FastCGI 的网关。...
在Visual C++(简称VC)开发环境中,资源管理是确保程序稳定性和性能的关键因素之一。不合理的资源管理可能导致内存泄漏、资源占用过高乃至程序崩溃等问题。本文将根据提供的资源分配及释放一览表,详细解析其中涉及...
在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存中清除…… Java Socket 聊天...