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 'ejs'的解决办法
如何快速搭建个人网站并优化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发送验证码倒计时应用

