Android加载大图

第一步:读取图片的尺寸和和类型

根据图片数据源的不同选择BitmapFactory的相应的静态方法,通过下面的方法就能够常见图片解码生成Bitmap对象。
如果是图片数据源是二进制流,选择BitmapFactory.decodeByteArray()方法,
如果图片在某个文件路径下面,选择BitmapFactory.decodeFile()方法,
如果图片是在APP的内部的res文件夹下面BitmapFactory.decodeResource()方法,
注意:通常调用上面三种方法签名中带有BitmapFactory.Options类型参数的方法,通过设置BitmapFactory.Options对象的inJustDecodeBounds 属性为true,这样就不会为解码图片分配内存,也就返回了一个空的Bitmap对象。但可以通过该方法获取到图片的宽和高以及图片的格式,通过这种方式我们就能在分配内存创建bitmap之前获取该图片的格式和尺寸(宽与高)这样就避免了出现java.lang.OutOfMemory异常。除非你百分之百确定此图片恰好在内存范围之内,否则一定要在解码图片之前获取其尺寸与类型,代码示例:

1 BitmapFactory.Options options = new BitmapFactory.Options();
2 options.inJustDecodeBounds = true;
3 BitmapFactory.decodeResource(getResources(), R.id.myimage, options);
4 int imageHeight = options.outHeight;
5 int imageWidth = options.outWidth;
6 String imageType = options.outMimeType;

第二步:将压缩版的图片加载到内存。

在第一步中我们已经得到了图片的尺寸,然后我们实际图片预计所使用内存,应用本身其他也需要占用内存,屏幕的大小,当前设备的像素,显示该图片的UI组件的宽与高等因素来决定是否要压缩图片如果要压缩图片,需要计算图片的压缩比例。然后将该压缩比例赋值给 BitmapFactory.Options对象的inSampleSize属性,注意在此之前BitmapFactory.Options对象的inJustDecodeBounds需要为true。同时计算的压缩比例应该是2的n(n为非负整数)次方,因为如果不为2的n次方,会采用四舍的方式转换到最接近该比例2的n次方那个数,示例代码如下:

 1 public static int calculateInSampleSize(
 2             BitmapFactory.Options options, int reqWidth, int reqHeight) {
 3     // 图片实际的高于宽
 4     final int height = options.outHeight;
 5     final int width = options.outWidth;
 6     int inSampleSize = 1;
 7
 8     if (height > reqHeight || width > reqWidth) {
 9
10         final int halfHeight = height / 2;
11         final int halfWidth = width / 2;
12
13         //计算最大的压缩比例,比例是2的幂并保证实际图片宽与高要大于最终展示图片的宽与高
14         while ((halfHeight / inSampleSize) > reqHeight
15                 && (halfWidth / inSampleSize) > reqWidth) {
16             inSampleSize *= 2;
17         }
18     }
19     return inSampleSize;
20 }

第三步:生成压缩后的图片

不要忘记此时需要将BitmapFactory.Options之前对象属性的inJustDecodeBounds设置为false,否则得到的Bitmap是null 。代码如下:

 1 public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId,
 2         int reqWidth, int reqHeight) {
 3
 4     // First decode with inJustDecodeBounds=true to check dimensions
 5     final BitmapFactory.Options options = new BitmapFactory.Options();
 6     options.inJustDecodeBounds = true;
 7     BitmapFactory.decodeResource(res, resId, options);
 8
 9     // Calculate inSampleSize
10     options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);
11
12     // Decode bitmap with inSampleSize set
13     options.inJustDecodeBounds = false;
14     return BitmapFactory.decodeResource(res, resId, options);
15 }

第四步:展示压缩的图片

1    mImageView.setImageBitmap( 2 decodeSampledBitmapFromResource(getResources(), R.id.myimage, 100, 100));

时间: 2024-10-24 14:46:10

Android加载大图的相关文章

Android 加载大图

在 Android 开发中, Bitmap 是个吃内存大户,稍微操作不当就会 OOM .虽然现在第三方的图片加载库已经很多,很完善,但是作为一个 Androider 还得知道如何自己进行操作来加载大图. 为什么加载图片会很容易造成 OOM 呢,主要是从图片加载到内存说起,假如一个图片的分辨率是 1000*20000,那么这张图片加载的内存中的大致大小为 1000*20000*4 = 80000000 字节,那么就是占用内存为 77 M 左右,这样的话,很容易造成 OOM . 为了不 OOM ,A

Android中高效的显示图片之一 ——加载大图

在网上看了不少文章,发现还是官方文档介绍最详细,把重要的东西简单摘要出来.详细可看官方文档地址 ( http://www.bangchui.org/read.php?tid=9 ) . 在应用中显示图片,如果不多加小心,很容易就会使应用因为异常“java.lang.OutofMemoryError:bitmap size exceeds VM budget”而导致crash.在android中加载图片需要一定的技巧性,主要是因为: 1.通常设备资源有限,安卓设备给每个应用只分配16M的空间.当然

Android 高效加载大图,多图解决方案,有效避免程序OOM

高效加载大图片 我们在编写Android程序的时候经常要用到许多图片,不同图片总是会有不同的形状.不同的大小,但在大多数情况下,这些图片都会大于我们程序所需要的大小.比如说系统图片库里展示的图片大都是用手机摄像头拍出来的,这些图片的分辨率会比我们手机屏幕的分辨率高得多.大家应该知道,我们编写的应用程序都是有一定内存限制的,程序占用了过高的内存就容易出现OOM(OutOfMemory)异常.我们可以通过下面的代码看出每个应用程序最高可用内存是多少. [java] view plaincopy in

有效解决Android加载大图片时内存溢出的问题

首先解析一下基本的知识: 位图模式,bitmap颜色位数是1位 灰度模式,bitmap颜色位数是8位,和256色一样 RGB模式,bitmap颜色位数是24位 在RGB模式下,一个像素对应的是红.绿.蓝三个字节 CMYK模式,bitmap颜色位数是32位  在CMYK模式下,一个像素对应的是青.品.黄.黑四个字节 图像文件的字节数(Byte) = 图像分辨率*颜色深度/8(bit/8) 例如:一幅640*480图像分辨率.RGB色一般为24位真彩色,图像未经压缩的数据容量为:640X480X24

Android加载网络GIF完整解决方案

前言: 加载并显示gif是App常见的一个功能,像加载普通图片一样,大体应该包含以下几项功能: 1.自动下载GIF到本地文件作为缓存,第二次加载同一个url的图片不需要下载第二遍 2.由于GIF往往较大,要显示圆形的进度条提示下载进度 3.在GIF完全下载完之前,先显示GIF的第一帧图像进行占位,完全下载完毕之后自动播放动画. 4.两个不同的页面加载同一张GIF,两个页面的加载进度应该一致 5.支持ViewPager同时加载多个GIF动图 效果演示:            实现思路: 1.关于下

解决MWPhotoBrowser中的SDWebImage加载大图导致的内存警告问题

解决MWPhotoBrowser中的SDWebImage加载大图导致的内存警告问题 iOS开发 · 2015-01-22 11:31 MWPhotoBrowser是一个非常不错的照片浏览器,在github的star接近3000个,地址:https://github.com/mwaterfall/MWPhotoBrowser.git MWPhotoBrowser来加载小图1M以下的都应该不会有内存警告的问题.如果遇到大图,3M.4M.5M的大图,很有可能导致内存警告.最近我就遇到这个问题,很是头疼

记:Ubuntu14.04 Android加载项目失败

Android 加载项目失败: sdk/build-tools/android-4.4.2/aapt: error while loading shared libraries: libz.so.1: cannot open shared object file: No such file or directory 安装: sudo apt-get install lib32z1 记:Ubuntu14.04 Android加载项目失败,布布扣,bubuko.com

Android加载大图片到内存

加载大图片到内存 步骤: 步骤一: 获取品屏幕的宽高数据;[HD1] 步骤二: 获取图片的宽高;[HD2] 步骤三: 计算屏幕与图片的宽高比例,按照差距最大的进行缩放处理;[HD3] 步骤四: 图片的缩放处理;[HD4] [HD1]// 获取手机的屏幕的窗体大小 WindowManager windowManager = (WindowManager) getSystemService(WINDOW_SERVICE); Display display = windowManager.getDef

Android -- 加载大图片的方法

在android中要加载一张大图片到内存中如果通过如下方式进行: Bitmap bitmap= BitmapFactory.decodeFile("/sdcard/a.jpg"); iv.setImageBitmap(bitmap); 则会抛出内存溢出异常Caused by: java.lang.OutOfMemoryError 正确的做法应该是这样的: public class MainActivity extends Activity { private ImageView iv;