我们的项目往往会载入图片.有时,承担太多,再装图片,它导致了非常小的程序卡,而在铅oom从而导致异常app再见,今天翻译google官方网站,它已经做了很好的图像处理汇总,由于Google我们已经给解决方案,这是非常必要的研究,译的地址为:http://developer.android.com/training/displaying-bitmaps/index.html

图片有各种形状和大小,但在大多数情况下,这些图片都会大于我们程序所须要的大小。

比方说系统图片库里展示的图片大都是用手机摄像头拍出来的。这些图片的分辨率会比我们手机屏幕的分辨率高得多。

大家应该知道,我们编写的应用程序都是有一定内存限制的。程序占用了过高的内存就easy出现OOM(OutOfMemory)异常。我们能够通过以下的代码看出每一个应用程序最高可用内存是多少。

<span style="font-size:18px;">int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024/1024);</span>

如今大部分手机都是32m,既然知道了每一个app分配的内存,所以就要计算好载入多少图片而不导致出现oom,所以要计算每张图片所占用的内存是多少,

Android中计算一张图片所占内存大小   图片长*宽*所占像素字节数,而像素字节数android中也就四种,

1:ALPHA_8 占1个字节

2:ARGB_4444
占2个字节

3:ARGB_8888
占4个字节

4:RGB_565
 占2个字节

:ARGB指的是一种色彩模式。里面A代表Alpha,R表示red,G表示green,B表示blue。事实上全部的可见色都是红绿蓝组成的,所以红绿蓝又称为三原色。

A  R  G  B

透明度 红色 绿色 蓝色

而这些字节数是能够通过bitmap对象去设置的,bitmap.setConfig(Bitmap.Config.ARGB_4444);假设这是个定值,那么要改变一个张图片的大小,就仅仅能改宽或者高了,假设仅仅改高,宽不变的话,就会造成图片变形,因此一般都是一起修改,所以图片要缩放,而缩放时依据屏幕的宽和高来缩放的,由于android设备非常多,每一个屏幕的宽和高也不一样,这样就能达到载入大图片避免oom,

BitmapFactory这个类提供了多个解析方法(decodeByteArray, decodeFile, decodeResource等)用于创建Bitmap对象。我们应该依据图片的来源选择合适的方法。

比方SD卡中的图片能够使用decodeFile方法,网络上的图片能够使用decodeStream方法。资源文件里的图片能够使用decodeResource方法。这些方法会尝试为已经构建的bitmap分配内存,这时就会非常easy导致OOM出现。为此每一种解析方法都提供了一个可选的BitmapFactory.Options參数,将这个參数的inJustDecodeBounds属性设置为true就能够让解析方法禁止为bitmap分配内存,返回值也不再是一个Bitmap对象。而是null。尽管Bitmap是null了。可是BitmapFactory.Options的outWidth、outHeight和outMimeType属性都会被赋值。

这个技巧让我们能够在载入图片之前就获取到图片的长宽值和MIME类型,从而依据情况对图片进行压缩。例如以下代码所看到的:

BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeResource(getResources(), R.id.myimage, options);
int imageHeight = options.outHeight;
int imageWidth = options.outWidth;
String imageType = options.outMimeType;

比方一张480*800的图片直接载入到内存中,假设图片非常多那就非常easy总成oom,那就必须压缩,比方按1/8进行压缩,压缩后得到的60*100,假设从server获取的图片规格不一样,那压缩后如今在imageview上肯定不一样,由于imageview宽和高肯定是设置成wrap_content,

如今写个demo来证明下:代码例如以下

package com.example.bitmapdemo;

import android.app.Activity;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.widget.ImageView; public class MainActivity extends Activity {
private ImageView iv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
iv = (ImageView) findViewById(R.id.iv);
Bitmap bitmap = decodeSampledBitmapFromResource(getResources(),R.drawable.b,60,100);
iv.setImageBitmap(bitmap);
} public static int calculateInSampleSize(BitmapFactory.Options options,
int reqWidth, int reqHeight) {
// 源图片的高度和宽度
final int height = options.outHeight;
final int width = options.outWidth;
int inSampleSize = 1;
if (height > reqHeight || width > reqWidth) {
// 计算出实际宽高和目标宽高的比率
final int heightRatio = Math.round((float) height / (float) reqHeight);
final int widthRatio = Math.round((float) width / (float) reqWidth);
//计算缩放比例
inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
}
return inSampleSize;
}
public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId,
int reqWidth, int reqHeight) {
// 第一次解析将inJustDecodeBounds设置为true。来获取图片大小
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeResource(res, resId, options);
// 调用上面定义的方法计算inSampleSize值
options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);
// 使用获取到的inSampleSize值再次解析图片
options.inJustDecodeBounds = false;
return BitmapFactory.decodeResource(res, resId, options);
} }

计算缩放比例一般有2种做法:

1:依据屏幕宽和高来缩放图片

2:依据要缩放后的宽和高来缩放,上面的样例就是依据这样的

使用图片缓存

Android

而s

版权声明:本文博主原创文章。博客,未经同意不得转载。

android 有效载荷大图,避OOM的更多相关文章

  1. Android加载大图不OOM

    首先,我们试着往sdcard里放一张400k的图片,但是分辨率是2560*1600 布局简单 <?xml version="1.0" encoding="utf-8 ...

  2. 【MDCC技术大咖秀】Android内存优化之OOM

    大神分析的很全面,所以就转过来保存一份,转自:http://www.csdn.net/article/2015-09-18/2825737/1 以下为正文: Android的内存优化是性能优化中很重要 ...

  3. Android加载图片OOM错误解决方式

    前几天做项目的时候,甲方要求是PAD (SAMSUNG P600 10.1寸 2560*1600)的PAD上显示高分辨率的大图片. SQLITE採用BOLD方式存储图片,这个存取过程就不说了哈,网上一 ...

  4. Android内存优化之OOM

    内容大多都是和OOM有关的实践总结概要.理解错误或是偏差的地方,还请多包涵指正,谢谢!本人Q:1524447071 (一)Android的内存管理机制 Google在Android的官网上有这样一篇文 ...

  5. 总结Android中遇见的OOM

    一 .Android应用中内存泄漏几种的原因: 1.单例模式导致的内存泄漏: 当调用getInstance时,如果传入的context是Activity的context.只要这个单例没有被释放,这个A ...

  6. 解决Android解析图片的OOM问题!!!(转)

    大家好,今天给大家分享的是解决解析图片的出现oom的问题,我们可以用BitmapFactory这里的各种Decode方法,如果图片很小的话,不会出现oom,但是当图片很大的时候 就要用BitmapFa ...

  7. android 加载图片oom若干方案小结

    本文根据网上提供的一些技术方案加上自己实际开发中遇到的情况小结. 众所周知,每个Android应用程序在运行时都有一定的内存限制,限制大小一般为16MB或24MB(视手机而定).一般我们可以通过获取当 ...

  8. Android app内存限制OOM

    Android系统的每个app做了内存限制,版本的android系统,不同的设备对每个app的内存限制可能有所不同,从早期的16M ,32M到现在的256M,384M...虽然内存增大了,但是不代表就 ...

  9. 王立平--android out of memory(OOM)产生原因

    开发图片视频应用常遇到这个错误. android 内存由 dalvik 和 native 2部分组成.dalvik 也就是 java 堆,创建的对象就是在这里分配的, 而 native 是通过 c/c ...

随机推荐

  1. C# Windows Phone 8 WP8 高级开发,制作不循环 Pivot ,图片(Gallery)导览不求人! 内附图文教学!!

    原文:C# Windows Phone 8 WP8 高级开发,制作不循环 Pivot ,图片(Gallery)导览不求人! 内附图文教学!! 一般我们在开发Winodws Phone APP 的时候往 ...

  2. Lucene40SkipListWriter

    多级跳跃表是保存在tim文件里的. tip是term index,tim是term dictionary.记忆方法是,p是pointer因此是term index. 这个类会保存多个level的las ...

  3. VMware vSphere 服务器虚拟化之十六 桌面虚拟化之VMware Horizon View

       VMware vSphere服务器虚拟化之十六 桌面虚拟化之VMware Horizon View  VMware Horizon View (原VMware View的升级版现在版本5.2)是 ...

  4. DM8168 CameraLink 视频噪点问题解决

    几天前写过FPGA採集LVDS视频(噪点去除),当时的情况是CameraLink视频出现了非常多噪点,不堪入目,硬件方面没有找到毛病,仅仅能是用硬件描写叙述语言对採集前端的FPGA又一次进行了处理,效 ...

  5. appendChild的用法

    appendChild的用法 1,先把元素从原有父级上删除 2,再把元素添加到新父级上

  6. 离PACKET_INp获取信息acket data

         于Floodlight模块假设要packet in消息,就对对应的消息类型进行监听就可以.然后在receive方法中就能够操纵这个上传上来的packet_in.      关键代码:   E ...

  7. 产品CEO?别傻了,你不是拿破仑

    编者按:本文出自技术产品经理Daniel Elizalde的博客,中文版由天地会珠海分舵进行编译. 全文针对如今流行的把产品经理比喻成"产品CEO"的这一说法进行深入的分析.跟大家 ...

  8. jQuery 代码的层定位滑动动画效果

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  9. HDU 2289 Cup(可以二分法,但是除了它的一半?)

    这道题目.运营商做数学题?算上两个子主题做?顶多算一个水主要议题... 首先,没有实际的二分法,但是,我们发现了一个新的解决方案,以取代二分法. 若果按照i从0,每次添加0.00000001我一直枚举 ...

  10. OpenCVR 有新成员 OpenCVV OpenCVC

    OpenCVC主要负责OpenCVR报名, OpenCVV支持Android IOS Mac Windows 的client 版权声明:本文博客原创文章,博客,未经同意,不得转载.