【幻化万千戏红尘】qianfeng-Android-Day20_Bitmap二次采样

Bitmap二次采样

一、二次采样:

(一)、意义或目的: 

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是解决该问题的关键之一

核心代码:

/**

 * Bitmap二次采样工具类

 */

public class BitmapUtil {

    public static Bitmap getBitmap(String filePath, int destWidth, int destHeight) {

        //第一采样

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

        options.inJustDecodeBounds = true;

        BitmapFactory.decodeFile(filePath, options);

        int outWidth = options.outWidth;

        int outHeight = options.outHeight;

        int sampleSize = 1;

        while ((outWidth / sampleSize > destWidth) || (outHeight / sampleSize > destHeight)) {

            sampleSize *= 2;

        }

        //第二次采样

        options.inJustDecodeBounds = false;

        options.inSampleSize = sampleSize;

        options.inPreferredConfig = Bitmap.Config.RGB_565;

        return BitmapFactory.decodeFile(filePath, options);

    }

}

二、Bitmap占用内存的计算:

(一)、概述:

        Android中一张图片(Bitmap)占用的内存主要和以下几个因数有关:图片长度,图片宽度,单位像素占用的字节数。一张图片(Bitmap)占用的内存=图片长度*图片宽度*单位像素占用的字节数注:图片长度和图片宽度的单位是像素。图片(Bitmap)占用的内存和屏幕密度(Density)无关。

        创建一个Bitmap时,其单位像素占用的字节数由其参数BitmapFactory.Options的inPreferredConfig变量决定。

(二)、inPreferredConfig属性简介

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

1、Bitmap.Config  ALPHA_8 :

· 此时图片只有alpha值,没有RGB值,一个像素占用一个字节 。

2、Bitmap.Config ARGB_4444 :

· 这种格式的图片,看起来质量太差,已经不推荐使用 而强烈推荐使用ARGB_8888来代替。

· 一个像素占用2个字节alpha(A)值,Red(R)值,Green(G)值,Blue(B)值各占4个bites 。 共16bites,即2个字节。

3、Bitmap.Config ARGB_8888

· 一个像素占用4个字节alpha(A)值,Red(R)值,Green(G)值,Blue(B)值各占8个bites , 共32bites , 即4个字节。这是一种高质量的图片格式,电脑上普通采用的格式。它也是Android手机上一个bitmap的默认格式。

4、Bitmap.Config RGB_565

· 一个像素占用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:

o  图片长度*图片宽度

o  100*100=10000字节

· ARGB_4444:

o  图片长度*图片宽度*2

o  100*100*2=20000字节 

· ARGB_8888:

o  图片长度*图片宽度*4

o  100*100*4=40000字节 

· RGB_565:

o  图片长度*图片宽度*2

o  100*100*2=20000字节

基于bert实现关系三元组抽取python源码+数据集+项目说明.zip基于bert实现关系三元组抽取python源码+数据集+项目说明.zip基于bert实现关系三元组抽取python源码+数据集+项目说明.zip基于bert实现关系三元组抽取python源码+数据集+项目说明.zip基于bert实现关系三元组抽取python源码+数据集+项目说明.zip 个人大四的毕业设计、课程设计、作业、经导师指导并认可通过的高分设计项目,评审平均分达96.5分。主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的学习者,也可作为课程设计、期末大作业。 [资源说明] 不懂运行,下载完可以私聊问,可远程教学 该资源内项目源码是个人的毕设或者课设、作业,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96.5分,放心下载使用! 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),供学习参考。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值