关闭

Bitmap 二次采样

标签: bitmapandroidandroid studioOOM图片
18663人阅读 评论(3) 收藏 举报
一、二次采样:
(一)、意义或目的: 

1、用BitmapFactory解码一张图片时,有时会遇到该错误。这往往是由于图片过大造成的。要想正常使用,则需要分配更少的内存空间来存储。BitmapFactory.decodeFile(imageFile);

2、BitmapFactory.Options.inSampleSize:设置恰当的inSampleSize可以使BitmapFactory分配更少的空间以消除该错误。

3、BitmapFactory.Options提供了另一个成员inJustDecodeBounds。设置inJustDecodeBounds为true后,decodeFile并不分配空间但可计算出原始图片的长度和宽度,即opts.width和opts.height。有了这两个参数,再通过一定的算法,即可得到一个恰当的inSampleSize

例如:

BitmapFactory.Options opts = new BitmapFactory.Options();

opts.inSampleSize = 4;

Bitmap bitmap = BitmapFactory.decodeFile(imageFile, opts);


(二)、获取inSampleSize:
设置恰当的inSampleSize是解决该问题的关键之一
查看Android源码,我们得知,为了得到恰当的inSampleSize,Android提供了一种动态计算的方法。

1、核心代码:

private Bitmap createImageThumbnail(String filePath, int newHeight,

int newWidth) {

BitmapFactory.Options options = new BitmapFactory.Options();

options.inJustDecodeBounds = true;

BitmapFactory.decodeFile(filePath, options);


int oldHeight = options.outHeight;

int oldWidth = options.outWidth;

// Log.i(TAG, "高度是:" + oldHeight + ",宽度是:" + oldWidth);

int ratioHeight = oldHeight / newHeight;

int ratioWidth = oldWidth / newWidth;


options.inSampleSize = ratioHeight > ratioWidth ? ratioWidth: ratioHeight;


options.inJustDecodeBounds = false;

Bitmap bm = BitmapFactory.decodeFile(filePath, options);

// Log.i(TAG, "高度是:" + options.outHeight + ",宽度是:" + options.outWidth);

return bm;

}



二、Bitmap占用内存的计算:

(一)、概述:
        Android中一张图片(Bitmap)占用的内存主要和以下几个因数有关:图片长度,图片宽度,单位像素占用的字节数。一张图片(Bitmap)占用的内存=图片长度*图片宽度*单位像素占用的字节数注:图片长度和图片宽度的单位是像素。图片(Bitmap)占用的内存应该和屏幕密度(Density)无关。
        创建一个Bitmap时,其单位像素占用的字节数由其参数BitmapFactory.Options的inPreferredConfig变量决定。

(二)、inPreferredConfig为Bitmap.Config类型,Bitmap.Config类是个枚举类型,它可以为以下值 Enum Values:

1、Bitmap.Config  ALPHA_8 :
  • Each pixel is stored as a single translucency (alpha) channel. This is very useful to efficiently store masks for instance. No color information is stored.  With this configuration, each pixel requires 1 byte of memory.
  • 此时图片只有alpha值,没有RGB值,一个像素占用一个字节 。

2、Bitmap.Config ARGB_4444 :
  • This field is deprecated. Because of the poor quality of this configuration, It is advised to use ARGB_8888 instead.
  • 这种格式的图片,看起来质量太差,已经不推荐使用。 而强烈推荐使用ARGB_8888来代替。
  • Each pixel is stored on 2 bytes. The three RGB color channels and the alpha channel (translucency)  are stored with a 4 bits precision (16 possible values.)  This configuration is mostly useful if the application needs to store translucency information  but also needs to save memory. It is recommended to use ARGB_8888 instead of this configuration.
  • 一个像素占用2个字节,alpha(A)值,Red(R)值,Green(G)值,Blue(B)值各占4个bites 。 共16bites,即2个字节。

3、Bitmap.Config ARGB_8888
  • Each pixel is stored on 4 bytes. Each channel (RGB and alpha for translucency) is stored with 8 bits of precision (256 possible values.) This configuration is very flexible and offers the best quality. It should be used whenever possible。
  • 一个像素占用4个字节,alpha(A)值,Red(R)值,Green(G)值,Blue(B)值各占8个bites , 共32bites , 即4个字节。这是一种高质量的图片格式,电脑上普通采用的格式。它也是Android手机上一个BitMap的默认格式。

4、Bitmap.Config RGB_565
  • Each pixel is stored on 2 bytes and only the RGB channels are encoded: red is stored with 5 bits of precision (32 possible values), green is stored with 6 bits of precision (64 possible values) and blue is stored with 5 bits of precision. This configuration can produce slight visual artifacts depending on the configuration of the source. For instance, without dithering, the result might show a greenish tint. To get better results dithering should be applied. This configuration may be useful when using opaque bitmaps that do not require high color fidelity.
  • 一个像素占用2个字节,没有alpha(A)值,即不支持透明和半透明, Red(R)值占5个bites ,Green(G)值占6个bites ,Blue(B)值占5个bites,共16bites,即2个字节。 对于半透明颜色的图片来说,该格式的图片能够达到比较好的呈现效果相对于ARGB_8888来说也能减少一半的内存开销,因此它是一个不错的选择。
  • 另外我们通过android.content.res.Resources来取得一个张图片时,它也是以该格式来构建BitMap。从Android4.0开始,该选项无效。即使设置为该值,系统任然会采用 ARGB_8888来构造图片。

【备注】:ARGB指的是一种色彩模式,里面A代表Alpha,R表示red,G表示green,B表示blue,其实所有的可见色都是红绿蓝组成的,所以红绿蓝又称为三原色。 ARGB就是:透明度 红色 绿色 蓝色。


(三)、图片格式占用内存的计算方法:以一张100*100px的图片占用内存为例
  • ALPHA_8:
    •  图片长度*图片宽度
    •  100*100=10000字节
  • ARGB_4444:
    •  图片长度*图片宽度*2
    •  100*100*2=20000字节 
  • ARGB_8888:
    •  图片长度*图片宽度*4
    •  100*100*4=40000字节 
  • RGB_565:
    •  图片长度*图片宽度*2
    •  100*100*2=20000字节






0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

Android Bitmap二次采样,大图处理

Bitmap 二次采样: 二次采样的目的是将高分辨率的图片进行采样缩放。由于手机给每个APP分配的空间是有限的。所以若是不对图片进行缩放的话,就容易造成内存溢出(即OOM,out of memory...
  • Whatfizzer
  • Whatfizzer
  • 2017-02-22 15:21
  • 754

Bitmap的二次采样

Bitmap可以理解为通过一个bit数组来存储特定数据的一种数据结构。 一,二次采样的意义和目的; 当网络访问加载图片的时候,我们会遇到OOM异常。这是因为图片过大产生的。想要正确使用则需要分配更少的...
  • yunlong_
  • yunlong_
  • 2015-12-22 11:51
  • 1883

Android开发之Bitmap二次采样

Bitmap二次采样,听着好像是一个高大上的事,其实也就那么回事,今天我们就来看看Bitmap的二次采样问题。1.为什么要二次采样OK,那么首先我要 解决的一个问题就是为什么我们要二次采样?不知道大家...
  • u012702547
  • u012702547
  • 2016-04-25 21:31
  • 8773

图片的三级缓存和二次采样使用的案例

首先跟大家介绍一下三级缓存,当然缓存的好处就是可以让用户体验更好,缺点就是没有实时更新数据,但我们大部分应用都不需要实时更新,所以三级缓存运用面比较广的。 所谓三级缓存其实是一种加载图片文件的策略,简...
  • MR_Condingson
  • MR_Condingson
  • 2016-11-19 10:59
  • 832

Bitmap二次采样

Android图片加载由于手机内存的原因,大图往往会使手机OOM(out of memory),所以需要对图片进行相应的压缩。 android提供了一个类BitmapFactory.Options,...
  • Joker_shen
  • Joker_shen
  • 2017-02-20 20:15
  • 160

Android 图片二次采样、质量压缩

引言: Android系统支持几种图片(.png (preferred), .jpg (acceptable), .gif (discouraged)), 其中Bitmap位图#ffffffff...
  • dalongjun
  • dalongjun
  • 2015-11-21 19:33
  • 3308

21、Bitmap二次采样

Bitmap二次采样 一、二次采样: (一)、意义或目的:  1、用BitmapFactory解码一张图片时,有时会遇到该错误。这往往是由于图片过大造成的。要想正常使用,...
  • yangzhenyutmac
  • yangzhenyutmac
  • 2016-09-29 15:30
  • 166

Bitmap 二次采样实现

本博文为转载,原创地址: http://blog.csdn.net/zimo2013/article/details/168494771.Bitmap概述 Android系统支持几种图片(.png...
  • u013597998
  • u013597998
  • 2016-01-01 14:58
  • 950

Bitmap二次采样

二次采样: (一)、意义或目的:  1、用BitmapFactory解码一张图片时,有时会遇到该错误。这往往是由于图片过大造成的。要想正常使用,则需要分配更少的内存空间来存储。Bitmap...
  • hht729668375
  • hht729668375
  • 2014-05-12 19:32
  • 1225

Bitmap二次采样

Android开发之Bitmap二次采样 Bitmap二次采样,听着好像是一个高大上的事,其实也就那么回事,今天我们就来看看Bitmap的二次采样问题。 1.为什么要二次采样 OK,...
  • ChEng225
  • ChEng225
  • 2017-11-16 19:18
  • 47
    个人资料
    • 访问:236869次
    • 积分:1800
    • 等级:
    • 排名:千里之外
    • 原创:21篇
    • 转载:5篇
    • 译文:0篇
    • 评论:20条
    最新评论