Android自助餐之大图片加载

Android自助餐之大图片加载

原理

  1. 使用BitmapFactory.decodeStreeam()方法,该方法会调用native层代码来创建bitmap(两个重载都会调用)
  2. 使用带BitmapFactory.Options参数的方法,改参数可指定生成bitmap的大小

思路

  1. 根据View尺寸或Window尺寸来确定bitmap的尺寸
  2. 将确定好的尺寸放入BitmapFactory.Options
  3. 调用BitmapFactory.decodeStreeam()生成bitmap

步骤

  1. 根据图片路径或URI打开输入流

    InputStream is = getContentResolver().openInputStream(imageUri);
  2. 获取屏幕或View尺寸

    如果能确定View尺寸则使用View尺寸,如果不能(比如动态调整的View、自适应的View等)则获取最接近该View的尺寸,实在不行就获取当前Activity的Window尺寸(比屏幕尺寸小)

    • 获取Window尺寸

      WindowManager windowManager = getWindowManager();

      Display defaultDisplay = windowManager.getDefaultDisplay();

      defaultDisplay.getHeight();

      defaultDisplay.getWidth();

    • 获取View尺寸

      view.getMeasuredWidth();

      view.getMeasuredHeight();

  3. 根据目标尺寸生成BitmapFactory.Options
    BitmapFactory.Options option = new BitmapFactory.Options();
    option.inSampleSize = dstSize;
  4. 使用options调用BitmapFactory.decodeStream()生成bitmap
    Bitmap bitmap = BitmapFactory.decodeStream(is, null, option);

完整代码

InputStream is = null;
try {

    int screenWidth=getWindowManager().getDefaultDisplay().getWidth();
    int screenHeight=getWindowManager().getDefaultDisplay().getHeight();
    int maxSize=Math.max(screenWidth,screenHeight);//以长边为准

    is = getContentResolver().openInputStream(imageUri);
    BitmapFactory.Options option = new BitmapFactory.Options();
    option.inSampleSize = maxSize;
    Bitmap bitmap = BitmapFactory.decodeStream(is, null, option);
    imageView.setImageBitmap(bitmap);
} catch (Exception e) {
    e.printStackTrace();
}
try{
    if(is!=null)is.close();
}
时间: 2024-10-29 19:08:34

Android自助餐之大图片加载的相关文章

Android BitmapFactory.Options 解决大图片加载OOM问题

当我们在Android使用bitmap加载图片过程中,它会将整张图片所有像素都存在内存中,由于Android对图片内存使用的限制,很容易出现OOM(Out of Memory)问题. 为了避免此类问题我们可以采用BitmapFactory.Options或是使用第三方的图片加载库.如Fresco.Picasso等. BitmapFactory.Options 读取图片尺寸.类型 如文档所示: 如果BitmapFactory.Options中inJustDecodeBounds 字段设置为true

Android中常见的图片加载框架

图片加载涉及到图片的缓存.图片的处理.图片的显示等.而随着市面上手机设备的硬件水平飞速发展,对图片的显示要求越来越高,稍微处理不好就会造成内存溢出等问题.很多软件厂家的通用做法就是借用第三方的框架进行图片加载. 开源框架的源码还是挺复杂的,但使用较为简单.大部分框架其实都差不多,配置稍微麻烦点,但是使用时一般只需要一行,显示方法一般会提供多个重载方法,支持不同需要.这样会减少很不必要的麻烦.同时,第三方框架的使用较为方便,这大大的减少了工作量.提高了开发效率.本文主要介绍四种常用的图片加载框架,

把大图片加载进内存

把图片加载进内存,要对图片进行缩放,否则内存溢出 代码: 1 package com.example.loadimage; 2 3 import android.os.Bundle; 4 import android.app.Activity; 5 import android.graphics.Bitmap; 6 import android.graphics.BitmapFactory; 7 import android.graphics.BitmapFactory.Options; 8 i

Android 开源框架 ( 九 ) 图片加载框架---ImageLoader

一.引言 Android的每一个App通常只拥有有限的系统资源,Android设备为每个App分配的内存大小是也是有上限的,并且,针对不同的设备配置所分配的内存大小也是不一样的,最小为16MB.图片会占用大量的内存,尤其是那些超清照片.所以图片加载时做容易造成安卓内存溢出的原因,而要解决这些问题还需要很多相关知识: 1.多线程下载,线程管理. 2.多级缓存架构设计和策略,内存缓存,磁盘缓存,缓存有效性处理. 3.图片压缩,特效处理,动画处理. 4.复杂网络情况下下载图片策略,例如弱网络等. 5.

教你写Android ImageLoader框架之图片加载与加载策略

在教你写Android ImageLoader框架之初始配置与请求调度中,我们已经讲述了ImageLoader的请求配置与调度相关的设计与实现.今天我们就来深入了解图片的具体加载过程以及加载的策略(包括按顺序加载和逆序加载) ,在这其中我会分享我的一些设计决策,也欢迎大家给我提建议. 图片的加载 Loader与LoaderManager的实现 在上一篇文章教你写Android ImageLoader框架之初始配置与请求调度中,我们聊到了Loader与LoaderManager. ImageLoa

Android 大图片加载 避免OOM

文章来自郭大神:======= 转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/9316683 本篇文章主要内容来自于Android Doc,我翻译之后又做了些加工,英文好的朋友也可以直接去读原文. http://developer.android.com/training/displaying-bitmaps/index.html 高效加载大图片 我们在编写Android程序的时候经常要用到许多图片,不同图片总是会有不同的形状.

canvas代替imgage,可以有效的提高大图片加载的速度!

//加载zepto插件 <script> //定义图片的数量 var total = 17; //获取屏幕的宽度 var zWin = $(window); //定义渲染图片的方法 var render = function(){ //图片的间距 var padding = 2; //图片存放位置的宽度 var winWidth = zWin.width(); //计算图片的宽度,以一行排列4张图为例,共有3个padding,取它的整数 var picWidth = Math.floor(wi

Android学习之多媒体开发---加载大图片

在实际中,有些时候我们需要从SD卡中加载一张很大的图片到内存中,但是如果你手机存储很小的话,如果直接将这张大图片放入内容就会导致分配失败等异常问题.所以我们就需要一种手段,将大图片也能正常的加载到内存,而不出现异常的情况. 那如何才能将大图片加载到内存中,而不出现内存溢出? Android系统提供了一个方法,通过显示比例加载图片,这样就会返回比原图更小的图片. 1: 先要获取该图片的参数情况,Android系统提供了一个BitmapFactory这个类 可以创建一个Bitmap对象,从不同的源可

Android Bitmap 全面解析(一)加载大尺寸图片

压缩原因:1.imageview大小如果是200*300那么加载个2000*3000的图片到内存中显然是浪费可耻滴行为;2.最重要的是图片过大时直接加载原图会造成OOM异常(out of memory内存溢出)所以一般对于大图我们需要进行下压缩处理权威处理方法参考 安卓开发者中心的大图片处理教程http://developer.android.com/training/displaying-bitmaps/load-bitmap.html看不懂英文的话木有关系,本篇会有介绍主要处理思路是:1.获