Android 实现加载大图片的方法

Android 实现加载大图片的方法,第1张

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

项目简介:

该项目为加载大图片

详细介绍:

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

该应用涉及到的知识有:

- 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 实现加载大图片的方法全部内容,希望文章能够帮你解决Android 实现加载大图片的方法所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1146511.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存