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开发之多媒体编程之加载大分辨率图片的更多相关文章

  1. 转 Android--加载大分辨率图片到内存

    在使用ImageView显示图片的时候,直接加载一个图片资源到内存中,经常会出现内存溢出的错误,这是因为有些图片的分辨率比较高,把它直接加载 到内存中之后,会导致堆内存溢出的问题.这篇博客就来讲解一下 ...

  2. 图片_ _Android--加载大分辨率图片到内存

    http://www.cnblogs.com/plokmju/p/android_LoadBigImage.html#3084005 前言 在使用ImageView显示图片的时候,直接加载一个图片资源 ...

  3. Android--加载大分辨率图片到内存

    前言 在使用ImageView显示图片的时候,直接加载一个图片资源到内存中,经常会出现内存溢出的错误,这是因为有些图片的分辨率比较高,把它直接加载到内存中之后,会导致堆内存溢出的问题.这篇博客就来讲解 ...

  4. ★android开发--ListView+Json+异步网络图片加载+滚动翻页的例子(图片能缓存,图片不错乱)

    例子中用于解析Json的Gson请自己Google下载 主Activity: package COM.Example.Main; import java.util.HashMap; import ja ...

  5. Android开发之多媒体编程之获取图片的副本

    使用BitmapFactory的decodeFile()方法获取的Bitmap对象是只读的,无法进行编辑操作 需要进行编辑的话,需要获取到该对象的一个副本 代码如下: import android.a ...

  6. Android学习笔记_51_转android 加载大图片防止内存溢出

    首先来还原一下堆内存溢出的错误.首先在SD卡上放一张照片,分辨率为(3776 X 2520),大小为3.88MB,是我自己用相机拍的一张照片.应用的布局很简单,一个Button一个ImageView, ...

  7. Android开发中如何解决加载大图片时内存溢出的问题

    Android开发中如何解决加载大图片时内存溢出的问题    在Android开发过程中,我们经常会遇到加载的图片过大导致内存溢出的问题,其实类似这样的问题已经屡见不鲜了,下面将一些好的解决方案分享给 ...

  8. Android Camera开发系列(上)——Camera的基本调用与实现拍照功能以及获取拍照图片加载大图片

    Android Camera开发系列(上)--Camera的基本调用与实现拍照功能以及获取拍照图片加载大图片 最近也是在搞个破相机,兼容性那叫一个不忍直视啊,于是自己翻阅了一些基本的资料,自己实现了一 ...

  9. Android(java)学习笔记236:多媒体之加载大图片到内存(Bitmap API)

    1.Bitmap (API使用) android里面的bitmap中,一个像素点需要4个byte去表示,这是因为android表示颜色是" argb ":其中 a 表示是透明度,然 ...

随机推荐

  1. CocoaPods安装和使用及问题:Setting up CocoaPods master repo

    CocoaPods是什么? 当你开发iOS应用时,会经常使用到很多第三方开源类库,比如JSONKit,AFNetWorking等等.可能某个类库又用到其他类库,所以要使用它,必须得另外下载其他类库,而 ...

  2. 关于canvas中的jquery

    关于h5,相比前端的同事们都很了解了吧!h5里面有个canvas,现在用的蛮火.但是canvas里面的代码确实是有点繁多,特别是要对于图形做什么操作的时候...我昨天无意间发现了一个canvas的插件 ...

  3. php计算时间差的方法

    一个简单的例子:计算借书的天数,根据每天的日期进行计算. (1) 有数据库的情况      MSSQL可以使用触发器!用专门计算日期差的函数datediff()便可.    MYSQL那就用两个日期字 ...

  4. PHP去掉转义后字符串中的反斜杠\函数stripslashes

    addslashes函数主要是在字符串中添加反斜杠对特殊字符进行转义,stripslashes则是去掉转义后字符串中的反斜杠\,比如当你提交一段 json数据到PHP端的时候可能会遇到json字符串中 ...

  5. DICOM开源库

    转载于 http://blog.csdn.net/jackmacro/article/details/5850142 Developers used to search for libraries , ...

  6. FireDAC如何连接ORACLE数据库

    UniDac对Oracle的Direct连接,不需要安装Oracle客户端dll,deploy时真的是方便又快捷. FireDac连接Oracle,在没有Oracle Client的情况下,是可以连接 ...

  7. 用python实现了一下:甲乙两人互猜数字(数理逻辑)

    今天在园子里看到博客:超难面试题:甲乙两人互猜数字(数理逻辑).然后琢磨了半天,写了个Python程序实现算法,我得出来的结果是1,6或1,8或35,42的组合, 不知道是否正确,请高人指点? 下面列 ...

  8. scrapy-redis使用详解

    描述: 1.使用两台机器,一台是win10,一台是centos7,分别在两台机器上部署scrapy来进行分布式抓取一个网站 2.centos7的ip地址为192.168.1.112,用来作为redis ...

  9. 【Passport】微软过时的技术

    虽然已过时,没来得及体验,摘录一段别人的文章,假装对passport的了解 微软在过去的身份验证服务上,一直采用的Passport验证,但已经是N年前推出来的一个软件架构,当然也被软件界很多地方采用到 ...

  10. Tesseract初探

    一.框架介绍 Tesseract 是一款图片识别工具,可以抓取图片中的文字,可以支持多种语言(默认是英语),需要下载开源文件可以在github上下载,如果知识应用不想太多深究直接在google cod ...