全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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  # 加载图片  # 加载大图片  # android 大图片拖拽并缩放实现原理  # Android 实现WebView点击图片查看大图列表及图片保存功能  # Android中超大图片无法显示的问题解决  # Android高效加载大图、多图解决方案 有效避免程序OOM  # Android编程实现大图滚动显示的方法  # Android 加载大图、多图和LruCache缓存详细介绍  # Android实现网络加载图片点击大图后浏览可缩放  # Android实现大图滚动显示效果  # Android仿头条、微信大图预览视图的方法详解  # 加载  # 设置为  # 阿尔法  # 象中  # 的是  # 放在  # 就不  # 而在  # 其他的  # 这就  # 这张  # 用了  # 第二个  # 要比  # 多大  # 详细介绍  # 不为  # 所示  # 会把  # 涉及到 


相关文章: 中山网站制作网页,中山新生登记系统登记流程?  建站主机选购指南与交易推荐:核心配置解析  清除minerd进程的简单方法  定制建站哪家更专业可靠?推荐榜单揭晓  如何在Tomcat中配置并部署网站项目?  C++中引用和指针有什么区别?(代码说明)  jQuery 常见小例汇总  建站之星展会模版如何一键下载生成?  大型企业网站制作流程,做网站需要注册公司吗?  安徽网站建设与外贸建站服务专业定制方案  如何用美橙互联一键搭建多站合一网站?  Thinkphp 中 distinct 的用法解析  如何通过西部建站助手安装IIS服务器?  html制作网站的步骤有哪些,iapp如何添加网页?  魔毅自助建站系统:模板定制与SEO优化一键生成指南  c++23 std::expected怎么用 c++优雅处理函数错误返回【详解】  猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?  阿里云网站制作公司,阿里云快速搭建网站好用吗?  相册网站制作软件,图片上的网址怎么复制?  如何自定义建站之星网站的导航菜单样式?  Java解压缩zip - 解压缩多个文件或文件夹实例  如何通过多用户协作模板快速搭建高效企业网站?  香港服务器建站指南:外贸独立站搭建与跨境电商配置流程  网站专业制作公司,网站编辑是做什么的?好做吗?工作前景如何?  Avalonia如何实现跨窗口通信 Avalonia窗口间数据传递  成都网站制作价格表,现在成都广电的单独网络宽带有多少的,资费是什么情况呢?  建站主机功能解析:服务器选择与快速搭建指南  广德云建站网站建设方案与建站流程优化指南  香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化  家庭建站与云服务器建站,如何选择更优?  网站制作话术技巧,网站推广做的好怎么话术?  如何在宝塔面板中创建新站点?  如何续费美橙建站之星域名及服务?  如何在万网ECS上快速搭建专属网站?  详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)  营销式网站制作方案,销售哪个网站招聘效果最好?  Python lxml的etree和ElementTree有什么区别  建站之星体验版:智能建站系统+响应式设计,多端适配快速建站  如何在Golang中使用encoding/gob序列化对象_存储和传输数据  建站之家VIP精选网站模板与SEO优化教程整合指南  个人摄影网站制作流程,摄影爱好者都去什么网站?  如何制作一个表白网站视频,关于勇敢表白的小标题?  深圳网站制作培训,深圳哪些招聘网站比较好?  建站之星展会模板:智能建站与自助搭建高效解决方案  微信h5制作网站有哪些,免费微信H5页面制作工具?  电脑免费海报制作网站推荐,招聘海报哪个网站多?  宠物网站制作html代码,有没有专门介绍宠物如何养的网站啊?  如何在建站主机中优化服务器配置?  常州企业网站制作公司,全国继续教育网怎么登录?  保定网站制作方案定制,保定招聘的渠道有哪些?找工作的人一般都去哪里看招聘信息? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。