Android开发之多媒体编程之加载大分辨率图片
Android中图片占用内存的大小=图片的总像数*每个像数占用的大小。
Android保存图片像素信息使用ARGB,意思是每个像素占用4个字节。
以分辨率为2400*3200的图片来说,加载到Android需要2400*3200*4=30720000字节,需要30000Kb,需要29.30Mb
直接把这个分辨率的图片加载到内存中,很容易OOM。
解决方法:把图片的分辨率缩放到手机屏幕的分辨率大小,这样就不会出现OOM
1.通过getWindowManager().getDefaultDisplay()方法获取到android.view.Display对象
2.通过android.view.Display对象的getRealSize()方法获取到手机屏幕分辨率的宽高
3.通过android.graphics.BitmapFactory的decodeFile(String pathName, Options opts)方法加载图片,第一个参数为图片的路径,第二个参数为android.graphics.BitmapFactory.Options对象,通过设置Options对象的参数inJustDecodeBounds = true,可以在不加载图片大小的情况下,获取到图片分辨率的宽高
4.把图片分辨率的宽和高分辨除以屏幕分辨率的宽和高,得到两个缩放比例,取较大值的缩放比例对图片进行缩放(注意:该缩放比例最好大于1,小于1的话,就不需要缩放了直接加载就可以了)
5.设置Options对象的参数inSampleSize为缩放比例,inJustDecodeBounds为false,然后使用android.graphics.BitmapFactory的decodeFile(String pathName, Options opts)方法加载图片,获取到以进行缩放的Bitmap的对象(inJustDecodeBounds为true时不会返回Bitmap对象)
6.处理该Bitmap对象。
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.BitmapFactory.Options;
import android.graphics.Point;
import android.os.Bundle;
import android.view.Display;
import android.view.View;
import android.widget.ImageView; public class MainActivity extends Activity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
} public void click(View v) {
Options opt = new Options();
opt.inJustDecodeBounds = true;
BitmapFactory.decodeFile("sdcard/dog.jpg", opt);
int imageHeight = opt.outHeight;
int imageWidth = opt.outWidth; Display display = getWindowManager().getDefaultDisplay();
Point point = new Point();
// 该方法已过时,使用getRealSize()方法替代。也可以使用getSize(),但是不能准确的获取到分辨率
// int screenHeight = display.getHeight();
// int screenWidth = display.getWidth(); display.getRealSize(point);
int screenHeight = point.y;
int screenWidth = point.x; int scale = 1;
int scaleWidth = imageWidth / screenWidth;
int scaleHeigh = imageHeight / screenHeight;
if (scaleWidth >= scaleHeigh && scaleWidth > 1) {
scale = scaleWidth;
} else if (scaleWidth < scaleHeigh && scaleHeigh > 1) {
scale = scaleHeigh;
} opt.inSampleSize = scale;
opt.inJustDecodeBounds = false; Bitmap bm = BitmapFactory.decodeFile("sdcard/dog.jpg", opt);
ImageView iv = (ImageView) findViewById(R.id.iv);
iv.setImageBitmap(bm);
} }
Android开发之多媒体编程之加载大分辨率图片的更多相关文章
- 转 Android--加载大分辨率图片到内存
在使用ImageView显示图片的时候,直接加载一个图片资源到内存中,经常会出现内存溢出的错误,这是因为有些图片的分辨率比较高,把它直接加载 到内存中之后,会导致堆内存溢出的问题.这篇博客就来讲解一下 ...
- 图片_ _Android--加载大分辨率图片到内存
http://www.cnblogs.com/plokmju/p/android_LoadBigImage.html#3084005 前言 在使用ImageView显示图片的时候,直接加载一个图片资源 ...
- Android--加载大分辨率图片到内存
前言 在使用ImageView显示图片的时候,直接加载一个图片资源到内存中,经常会出现内存溢出的错误,这是因为有些图片的分辨率比较高,把它直接加载到内存中之后,会导致堆内存溢出的问题.这篇博客就来讲解 ...
- ★android开发--ListView+Json+异步网络图片加载+滚动翻页的例子(图片能缓存,图片不错乱)
例子中用于解析Json的Gson请自己Google下载 主Activity: package COM.Example.Main; import java.util.HashMap; import ja ...
- Android开发之多媒体编程之获取图片的副本
使用BitmapFactory的decodeFile()方法获取的Bitmap对象是只读的,无法进行编辑操作 需要进行编辑的话,需要获取到该对象的一个副本 代码如下: import android.a ...
- Android学习笔记_51_转android 加载大图片防止内存溢出
首先来还原一下堆内存溢出的错误.首先在SD卡上放一张照片,分辨率为(3776 X 2520),大小为3.88MB,是我自己用相机拍的一张照片.应用的布局很简单,一个Button一个ImageView, ...
- Android开发中如何解决加载大图片时内存溢出的问题
Android开发中如何解决加载大图片时内存溢出的问题 在Android开发过程中,我们经常会遇到加载的图片过大导致内存溢出的问题,其实类似这样的问题已经屡见不鲜了,下面将一些好的解决方案分享给 ...
- Android Camera开发系列(上)——Camera的基本调用与实现拍照功能以及获取拍照图片加载大图片
Android Camera开发系列(上)--Camera的基本调用与实现拍照功能以及获取拍照图片加载大图片 最近也是在搞个破相机,兼容性那叫一个不忍直视啊,于是自己翻阅了一些基本的资料,自己实现了一 ...
- Android(java)学习笔记236:多媒体之加载大图片到内存(Bitmap API)
1.Bitmap (API使用) android里面的bitmap中,一个像素点需要4个byte去表示,这是因为android表示颜色是" argb ":其中 a 表示是透明度,然 ...
随机推荐
- phpstorm配置取消掉63342
http://ask.csdn.net/questions/171665
- WordPress 模板常用函数
WordPress 基本模板文件 一套完整的 WordPress 模板应至少具有如下文件: style.css : CSS(样式表)文件 index.php : 主页模板 archive.php : ...
- Spark Streaming揭秘 Day28 在集成开发环境中详解Spark Streaming的运行日志内幕
Spark Streaming揭秘 Day28 在集成开发环境中详解Spark Streaming的运行日志内幕 今天会逐行解析一下SparkStreaming运行的日志,运行的是WordCountO ...
- linux 输入子系统(4)---- input子系统的初始化
Input子系统的初始化函数为input_init(),如下: static int __init input_init(void) { int err; input_init_abs_bypass( ...
- 1054. The Dominant Color (20)
时间限制 100 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Behind the scenes in the compute ...
- Sybase ASE安装过程报错,无法创建数据库设备[AM fork() failed]
今天同事要搭建一套测试环境,安装开发版的SYBASE ASE 15.03 Windows平台下的,发现安装过程中到了创建数据库设备的环节就开始报错了,报错信息如下: 03/24/14 09:31:44 ...
- Linux操作系统
Linux操作系统 linux源码分析(三)-start_kernel 2016-10-26 11:01 by 轩脉刃, 146 阅读, 收藏, 编辑 前置:这里使用的linux版本是4.8,x86体 ...
- ios登陆界面
代码较老,仅供参考 主要涉及的功能点有: 1.密码输入框要隐藏输入字符,以黑点代替,有时候会在边上设置一个按钮,让用户选择是否需要密文输入 2.Login时会检查输入框,若输入不合法,弹窗提示用户 3 ...
- 1042: [HAOI2008]硬币购物 - BZOJ
Description 硬币购物一共有4种硬币.面值分别为c1,c2,c3,c4.某人去商店买东西,去了tot次.每次带di枚ci硬币,买si的价值的东西.请问每次有多少种付款方法.Input 第一行 ...
- 1029: [JSOI2007]建筑抢修 - BZOJ
Description 小刚在玩JSOI提供的一个称之为“建筑抢修”的电脑游戏:经过了一场激烈的战斗,T部落消灭了所有z部落的入侵者.但是T部落的基地里已经有N个建筑设施受到了严重的损伤,如果不尽快修 ...