Android 实现加载大图片的方法

 更新时间:2017年04月02日 17:28:50   作者:我好_菜  
对于超大的图片,如果不缩放的话,容易导致内存溢出。而经过处理后,无论多大的图片,都能够在手机屏幕上加载出来,不会导致内存溢出。本文将对Android 加载大图片的实现方法进行介绍,下面跟着小编一起来看下吧

项目简介:

该项目为加载大图片

详细介绍:

对于超大的图片,如果不缩放的话,容易导致内存溢出。而经过处理后,无论多大的图片,都能够在手机屏幕上加载出来,不会导致内存溢出。当然,脸黑的除外

该应用涉及到的知识有:

- 1.Bitmap的使用

- 2.Android手机中加载图片的原理

  有的时候,我们加载一张不足1M的图片,尽管手机的堆内存有16M,仍然会导致内存溢出,why?

  这就更计算机加载图片的原理有关了:

  1).手机会解析图片的所有像素信息,把每个像素信息都存入到内存中

  2).Android中保存图片是用ARGB保存的,A表示阿尔法透明度,所以一个像素点占用了4个字节

例如:一张1080*720像素的24位位图图片,可能实际上经过压缩后大小只有几十K,而在android手机加载这张图片所需要的内存大小为:

1080*720*(3+1)=3110400 byte = 3037 KB = 2.9MB

实际上,图片中还包含一点其他的信息,例如图片保存的格式,使用的相机名称,以及拍摄时间等,所以总体来说要比3110400字节大一旦,大概多上几十个字节

步骤:

1.创建一个Android项目,编写布局文件:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:tools="http://schemas.android.com/tools"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:orientation="vertical"
 tools:context="hhh.exercise.smultimedia_a_image.MainActivity" >

 <EditText
  android:id="@+id/ed"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:gravity="center"
  android:text="a.jpg"
  android:textColor="#00ff00"
  android:textSize="30sp" />

 <requestFocus />

 <Button
  android:onClick="see"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:text="点击看片"
  android:textColor="#00ffff"
  android:textSize="30sp" />

 <ImageView
  android:id="@+id/iv"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:layout_gravity="center"
  android:src="@drawable/ic_launcher" />
</LinearLayout>

界面如下所示:

2.在MainActivity中编写代码:

public class MainActivity extends Activity {
 private EditText ed;
 private ImageView iv;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  ed = (EditText) findViewById(R.id.ed);
  iv = (ImageView) findViewById(R.id.iv);
 }
 public void see(View view) {
  // 确定要加载的图片(这里为了调试方面,把所有的图片都放在SD卡中,然后在界面上输入图片的名字,根据给名字拼接字符串)
  String fileName = ed.getText().toString();
  String path = Environment.getExternalStorageDirectory().getPath()+ "/" + fileName;

  // 该类为位图工厂(BitmapFactory)的内部类,用来封装参数对象
  Options opts = new Options();

  // 不为像素申请内存,只获取图片的宽、高信息
  // inJustDecodeBound该字段设置为true,那么位图工厂构建BitMap对象时返回的是空值,但是会把图片的一些信息返回在Options对象中(如图片的宽、高等)
  opts.inJustDecodeBounds = true;

  // 第二个参数是解析图片时传入的参数,由于可能传入的参数过多,所以直接把所有参数封装成一个对象
  BitmapFactory.decodeFile(path, opts);

  // 获取图片的额宽高
  int imgWidth = opts.outWidth;
  int imgHeight = opts.outHeight;

  // 获取当前手机屏幕的宽高
  Display dp = getWindowManager().getDefaultDisplay();
  int screenWidth = dp.getWidth();
  int screenHeight = dp.getHeight();

  // 设置默认缩放比为1
  int scale = 1;

  // 计算图片宽高与屏幕宽高比例,即计算宽缩放比,高缩放比
  int scaleWidth = imgWidth / screenWidth;
  int scaleHeight = imgHeight / screenHeight;

  // 选择缩放比例,如果图片比屏幕小,就不进行缩放.如果图片比屏幕大,但是宽高缩放比例不同,选择缩放比大
  if (scaleWidth >= scaleHeight && scaleWidth > 1) {
   scale = scaleWidth;
  } else if (scaleWidth < scaleHeight && scaleHeight > 1) {
   scale = scaleHeight;
  }
  // 在Options的对象中设置缩放比例
  opts.inSampleSize = scale;
  // 一定要把inJustDecodeBound该字段设置为false,实际上默认值是false,
  // 但是在前面的代码中已经改为了true,所以要更改过来。当然,也可以重新new 一个Option是对象
  opts.inJustDecodeBounds = false;
  Bitmap bm = BitmapFactory.decodeFile(path, opts);
  iv.setImageBitmap(bm);
 }
}

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持脚本之家!

相关文章

  • Android RollPagerView实现轮播图

    Android RollPagerView实现轮播图

    这篇文章主要介绍了Android RollPagerView实现轮播图的相关资料,这里提供实例来实现轮播图的简单实例,希望能帮助到大家,需要的朋友可以参考下
    2017-08-08
  • Android开发登陆案例

    Android开发登陆案例

    这篇文章主要介绍了Android开发登陆案例的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-07-07
  • Android中的xml解析介绍

    Android中的xml解析介绍

    大家好,本篇文章主要讲的是Android中的xml解析介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-01-01
  • Android Studio手动配置Gradle的方法

    Android Studio手动配置Gradle的方法

    Gradle:Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化建构工具。它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,抛弃了基于XML的各种繁琐配置,本文给大家介绍Android Studio手动配置Gradle的方法,一起看看吧
    2017-11-11
  • JSON解析和XML解析区别对比

    JSON解析和XML解析区别对比

    JSON解析和XML解析是较为普遍的两种解析方式,其中JSON解析的市场分额更大。这篇文章主要介绍了JSON解析和XML解析区别对比,需要的朋友可以参考下
    2016-10-10
  • Android编程读取Assets所有文件(遍历每一个文件夹)并存入sdcard的方法

    Android编程读取Assets所有文件(遍历每一个文件夹)并存入sdcard的方法

    这篇文章主要介绍了Android编程读取Assets所有文件(遍历每一个文件夹)并存入sdcard的方法,涉及Android针对文件与目录的遍历及I/O操作相关技巧,需要的朋友可以参考下
    2016-02-02
  • Android 10 启动之servicemanager源码解析

    Android 10 启动之servicemanager源码解析

    这篇文章主要为大家介绍了Android 10 启动之servicemanager源码解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10
  • Android自定义对话框Dialog

    Android自定义对话框Dialog

    这篇文章主要为大家详细介绍了Android自定义对话框Dialog的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-04-04
  • Android多渠道打包神器ProductFlavor详解

    Android多渠道打包神器ProductFlavor详解

    最近一直在学习Android Gradle 相关的知识点,今天刚好看到了 ProductFlavor 这节,ProductFlavor 的出现非常友好的帮助我们开发者解决了版本区分的问题
    2022-07-07
  • Android动态表格的实现代码(内容、样式可扩缩)

    Android动态表格的实现代码(内容、样式可扩缩)

    这篇文章主要介绍了Android动态表格的实现代码(内容、样式可扩缩),本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09

最新评论