Bitmap加载选项:BitmapFactory.Options

QuibblerQuibbler 2020-04-27 约 9 分钟 1829 次阅读

Bitmap加载选项:BitmapFactory.Options

1、BitmapFactory.Options

BitmapFactory.Options是BitmapFactory加载Bitmap用到的选项配置,用于解码Bitmap的时设置各种参数选项。BitmapFactory的使用参考BitmapFactory详解。

2、重要属性

BitmapFactory.Options类有很多public成员变量,用于设置重要的属性。

2.1、injustDecodeBounds

设为true,那么BitmapFactory并不会真的返回一个Bitmap。但Bitmap的outWidth、outHeight等属性将会初始化,这样就不会占用太多内存,也就就可以避免直接加载较大的图片而发生OOM。一般用来先查询图片的宽、高,再计算另一个重要的属性inSampleSize。

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

2.2、inSampleSize

图像采样率,图片太大时,通过设置采样率,压缩图片。有现成的通用方法计算采样率:

inSampleSize>1时,图像高、宽分别以的1/inSampleSize²缩小

inSampleSize ≤ 1时,图像高、宽不变

/**
     * 计算采样率
     *
     * @param options       获取图片的边界信息
     * @param requestWidth  View的宽度
     * @param requestHeight View的高度
     * @return int          返回Bitmap采样率
     */
    public static int calculateInSampleSize(BitmapFactory.Options options, int requestWidth, int requestHeight) {
        //获取图片的真实的宽高
        int width = options.outWidth;
        int height = options.outHeight;
        //默认 1  1代表不对图片进行任何压缩
        int inSampleSize = 1;
        options.inSampleSize = inSampleSize;
        //计算采样率
        if (width > requestWidth || height > requestHeight) {
            int halfWidth = width / 2;
            int halfHeight = height / 2;
            while ((halfWidth / inSampleSize) >= requestWidth &&
                    (halfHeight / inSampleSize) >= requestHeight) {
                //计算采样率
                inSampleSize *= 2;
            }
        }
        return inSampleSize;
    }

2.3、outWidth & outHeight

Bitmap图像的宽和高。

2.4、inPreferredConfig

色彩模式,默认值Bitmap.Config.ARGB_8888。一个像素点占用4bytes空间,比较占用内存的一种色彩模式,但是支持ARGB透明度的图像,适合加载.png位图。

public Bitmap.Config inPreferredConfig = Bitmap.Config.ARGB_8888;

Bitmap.Config枚举中还定义了其它几种色彩模式,另见Bitmap位图介绍第1.2节。

public enum Config {
        ALPHA_8     (1),
        
        RGB_565     (3),
        
        @Deprecated
        ARGB_4444   (4),
        
        ARGB_8888   (5),
        
        RGBA_F16    (6),
        
        HARDWARE    (7);
    }

2.5、inPremultiplied

①如果设置了true(默认是true),那么返回的图片RGB都会预乘透明通道A后的颜色

②系统View或者Canvas绘制图片,不建议设置为fase,否则会抛出异常,这是因为系统会假定所有图像都预乘A通道的已简化绘制时间.

③设置inPremultiplied的同时,设置inScale会导致绘制的颜色不正确

2.6、inDither

设置是否抖动处理图片。

2.7、inDensity

设置Bitmap位图的像素密度,即每英寸有多少个像素。对应DisplayMetrics中的densityDpi。

2.8、inTargetDensity

设置绘制位图的屏幕密度,与inScale和inDesity一起使用,来对位图进行放缩。

2.9、inScreenDensity

使用的实际屏幕的像素密度。对应DisplayMetrics中的densityDpi。

2.10、inScaled

Bitmap是否可以缩放,默认值true,可以被缩放。

        注:inDesity, inTargetDensity,inScreenDensity这三个参数主是确定是否需要对bitmap进行缩放处理,如果缩放,缩放后的W和H应该是多少,缩放比例主要是通过:InTargetDenisity/inDensity作为缩放比例。

2.11、inPreferQualityOverSpeed

这个值表示是否在解码时图片有更高的品质,仅用于JPEG格式。如果设置为true,则图片会有更高的品质,但是会解码速度会很慢。

2.12、inPurgeable & inInputShareable*

Android 5.0以后已经弃用该字段。Android 4.4及以下版本中,如果将其设置为true,则生成的位图将分配其像素,以便在系统需要回收内存时可以将其清除。 在那种情况下,当需要再次访问像素时(例如绘制位图,调用getPixels()),它们将被自动重新解码。

参考文献:

        Android中BitmapFactory.Options详解

        Android中的抖动解码(inDither)

        安卓BitmapFactory处理图片

        浅谈BitmapFactory.Options

        图片基础知识梳理(1) - ImageView 的 ScaleType 属性解析

        图片基础知识梳理(2) - Bitmap 占用内存分析

        图片基础知识梳理(3) - Bitmap&BitmapFactory 解析

        浅谈BitmapFactory.Options

        Android inpreferredconfig参数分析

相关推荐

精选
ViewPager和PagerAdapter、FragmentPagerAdapter、FragmentStatePager
Android

ViewPager和PagerAdapter、FragmentPagerAdapter、FragmentStatePager

ViewPager1、ViewPagerandroidx.viewpager.widget.ViewPager,Android中使用非常广泛的控件,可以说是APP必备:首次打开引导页、页面Banner广告等。常用方法:setAdapter() 设置适配器setOffscreenPageLimit() 设置缓存的页面个数,默认是 1setCurrentItem() 跳转到特定的页面setOnPage

1.1k
获取Android内置WebView内核版本
Android

获取Android内置WebView内核版本

获取Android内置WebView内核版本竟然能遇到这样奇葩的事情,网页用的技术过于新颖,以至于只支持高版本Chromium内核的,低版本安卓系统中内置的内核版本较低,无法加载前端页面。1、设置查看在系统设置里 > 应用 > 应用管理 > 显示系统应用,查看WebView组件:2、页面查看通过WebView发起的网络请求,都会带上浏览器的UA,通常页面都可以通过UA判断浏览器的内核版本。这里有两

1.1w
Android 14适配总结
Android

Android 14适配总结

Android 14适配总结毕业工作至今已经适配了三个Android大版本,从Android 11到Android 12、再到Android 13。2023年,Google即将推出的Android 14,上半年已经开始第一批适配。现在,第四个Android版本已经适配完,总结记录一下。1、Android 14计划Google一般会在2月份对外发布预告,同时放出开发者预览版。“拉通”各大平台、厂商以

1.1w