Android 实现加载大图片的方法

发布时间 - 2026-01-11 00:29:43    点击率:

项目简介:

该项目为加载大图片

详细介绍:

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

该应用涉及到的知识有:

- 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仿头条、微信大图预览视图的方法详解  # 加载  # 设置为  # 阿尔法  # 象中  # 的是  # 放在  # 就不  # 而在  # 其他的  # 这就  # 这张  # 用了  # 第二个  # 要比  # 多大  # 详细介绍  # 不为  # 所示  # 会把  # 涉及到 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何快速搭建安全的FTP站点?  如何用低价快速搭建高质量网站?  node.js报错:Cannot find module &#39;ejs&#39;的解决办法  如何快速搭建个人网站并优化SEO?  如何在搬瓦工VPS快速搭建网站?  湖南网站制作公司,湖南上善若水科技有限公司做什么的?  Laravel怎么进行数据库事务处理_Laravel DB Facade事务操作确保数据一致性  如何确保西部建站助手FTP传输的安全性?  HTML5打空格有哪些误区_新手常犯的空格使用错误【技巧】  如何正确选择百度移动适配建站域名?  如何快速搭建二级域名独立网站?  大连 网站制作,大连天途有线官网?  大型企业网站制作流程,做网站需要注册公司吗?  Laravel怎么配置S3云存储驱动_Laravel集成阿里云OSS或AWS S3存储桶【教程】  Python企业级消息系统教程_KafkaRabbitMQ高并发应用  Laravel如何实现一对一模型关联?(Eloquent示例)  Laravel N+1查询问题如何解决_Eloquent预加载(Eager Loading)优化数据库查询  Android中Textview和图片同行显示(文字超出用省略号,图片自动靠右边)  如何快速查询域名建站关键信息?  如何用虚拟主机快速搭建网站?详细步骤解析  JS经典正则表达式笔试题汇总  如何在IIS管理器中快速创建并配置网站?  Laravel如何使用Facades(门面)及其工作原理_Laravel门面模式与底层机制  jQuery 常见小例汇总  IOS倒计时设置UIButton标题title的抖动问题  如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南  高性能网站服务器部署指南:稳定运行与安全配置优化方案  Laravel项目如何进行性能优化_Laravel应用性能分析与优化技巧大全  如何在企业微信快速生成手机电脑官网?  Laravel如何实现本地化和多语言支持_Laravel多语言配置与翻译文件管理  利用 Google AI 进行 YouTube 视频 SEO 描述优化  网站制作免费,什么网站能看正片电影?  Swift中switch语句区间和元组模式匹配  如何用wdcp快速搭建高效网站?  Laravel怎么做缓存_Laravel Cache系统提升应用速度的策略与技巧  如何用AWS免费套餐快速搭建高效网站?  在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?  海南网站制作公司有哪些,海口网是哪家的?  Windows10电脑怎么查看硬盘通电时间_Win10使用工具检测磁盘健康  消息称 OpenAI 正研发的神秘硬件设备或为智能笔,富士康代工  网站制作大概要多少钱一个,做一个平台网站大概多少钱?  Laravel Sail是什么_基于Docker的Laravel本地开发环境Sail入门  Windows Hello人脸识别突然无法使用  标题:Vue + Vuex 项目中正确使用 JWT 进行身份认证的实践指南  Laravel中Service Container是做什么的_Laravel服务容器与依赖注入核心概念解析  如何在云虚拟主机上快速搭建个人网站?  如何在IIS服务器上快速部署高效网站?  网站制作价目表怎么做,珍爱网婚介费用多少?  Laravel如何使用Eloquent进行子查询  iOS发送验证码倒计时应用