栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Android Bitmap浅析

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Android Bitmap浅析

Bitmap浅析
      • 什么是Bitmap
        • 1.Bitmap.Config类
        • 2.位深和色深
        • 3.常见的压缩格式
        • 4.Bitmap的简单使用
            • 4.1 Bitmap的创建方法
            • 4.2 通过**BitmapFactory**工厂类
            • 4.3 Bitmap的压缩存储方法
            • 4.3 BitmapFactory.Option类

什么是Bitmap

Bitmap也就是位图,它本质上就是一张图片的内容在内存中的表达形式。它将图片的内容看作是由存储数据的有限个像素点组成的,每个像素点存储该位置的ARGB值,当每个像素点的ARGB值确定下来的时候,图片的内容也就确定了。
ARGB:其中A代表透明度,RGB代表红绿蓝三种颜色通道值,每个通道的取值范围在0–255之间,也即是有256个值,正好可以通过一个字节(8bit)进行表示。所以每个通道值由一个字节表示,四个字节表示一个像素信息。

1.Bitmap.Config类

Bitmap.Config是Bitmap中的一个enum类


通过官方文档可以知道,它表示的就是每个像素点对ARGB通道值的存储方式。
主要的存储方式有以下四种:

  1. ARGB_8888:每个通道值都采用一个字节来表示,每个像素点需要用四个字节来表示,图片的质量是最高的,但是占用内存也是最多的
  2. ARGB_4444:和上面类似,每个通道值都是四位,每个像素点用两个字节表示,图片失真比较严重,所以一般不采用
  3. RGB_565:不支持透明度,RGB分别占用5,6,5位;每个像素点占用两个字节,,是ARGB_8888方案的一半
  4. ALPHA_8:不支持颜色值,只支持透明度,使用场景比较特殊,比如设置覆盖效果等
    通常我们会在ARGB_8888和RGB_565之间进行选择。
2.位深和色深

图片在内存和磁盘中的两种表现形式分别为bitmap和各种压缩格式

(1)色深:色深指的是每一个像素点用多少bit来存储ARGB值,属于图片自身的一种属性。
色深可以用来衡量一张图片的色彩处理能力(丰富程度)。
Bitmap.Config参数的值指的就是色深。比如ARGB_8888的色深为32位。
(2)位深:位深指的是在对Bitmap进行压缩时存储每个像素点所用的bit数,主要用于存储;
由于是压缩存储,所以位深值一般小于或者等于色深值。
假如说一张图片是100 * 100像素,色深32位(ARGB_8888),保存时位深是24位,
该图片在内存中所占的大小:100 * 100 *(32/8)个byte
在文件中所占用的大小 :100 * 100 (32/8)(24/32)个byte。

3.常见的压缩格式

Bitmap的压缩格式就是最终持久化存储得到的图片样式,一般通过图片的后缀名就可以知道通过什么方式进行的压缩。

  1. Gif :Gif是一种无损压缩格式,压缩率一般在50%,Gif可以插入多帧,从而实现动画效果,因此Gif也分为静态和动态两种
  2. BMP:BMP是标准图形格式,它是包括Windows在内的多种操作系统图像展现的形式,其本质就是bitmap对象直接持久化保存的文件格式,因为没有进行压缩,所以图片尺寸非常大。
  3. PNG:PNG也属于无损压缩,位深位32位。
  4. JPREG:JPEG是一种有损压缩格式,采用24位存储RGB通道值,也就是说JPEG不支持透明度
  5. WEBP:Webp是Google在2010年发布的一种新的图片格式,支持有损压缩和无损压缩,支持完整的透明通道,也支持多帧动画,基本取代了gif。
4.Bitmap的简单使用 4.1 Bitmap的创建方法

在Bitmap类中,构造方法是默认权限,并且Bitmap这个类也是final的,所以我们并不能通过new来创建bitmap对象。
所以我们需要通过Bitmap类的静态方法来创建。

其中呢大致分为三类
(1)根据已有的bitmap对象来创建新的bitmap对象

 
    public static Bitmap createBitmap( Bitmap source, int x, int y, int width, int height,
                                       Matrix m, boolean filter){
    }

( 2) 通过像素点数据进行创建

**
     * 返回一个具有指定宽度和高度的不可变位图,每个像素值设置位color数组中的对应值
     * @param display
     * @param colors 像素点数组
     * @param offset 颜色数组中第一个值的位置
     * @param stride 行之间数组中的颜色数(需>=width 或者 <= -width)
     * @param width 宽度
     * @param height 高度
     * @param config 要创建的bitmap的配置(如果不支持A通道,数组中的alpha值将无效)
     * @return
     */
    public static Bitmap createBitmap(DisplayMetrics display,
                                      @ColorInt int[] colors, int offset, int stride,
                                      int width, int height,Bitmap.Config config){}

( 3)通过对原位图进行缩放

    public static Bitmap createBitmap(Bitmap source, int x, int y, int width, int height)
4.2 通过BitmapFactory工厂类

BitmapFactory是Bitmap的工具类,通过各种数据源来创建bitmap对象。

  • decodeFile:从本地图片文件中加载bitmap对象
  • decodeResource:从项目资源文件中加载bitmap对象
  • decodeStream:从流对象(网络输入流或者本地文件输入流)加载bitmap对象
  • decodeByteArray:从字节数组中加载
    其中decodeFile和decodeResource最终都会通过decodeStream方法来解析加载Bitmap对象。
4.3 Bitmap的压缩存储方法

Bitmap的压缩存储和加载正好是相反的过程,通过compress方法进行实现。

 
    public boolean compress(Bitmap.CompressFormat format, int quality, OutputStream stream)
4.3 BitmapFactory.Option类

BitmapFactory.Option代表对Bitmap对象的属性设置。
一般情况下,调用decodexxx方法时我们不需要传递这个属性值,此时是通过默认的配置信息来创建bitmap对象;
如果我们需要自定义Bitmap的属性就需要传递option对象(通过Option的构造方法进行创建)

常见的配置信息:

属性作用
boolean inJustDecodeBounds如果这个值为true,在解码时不会返回bitmap对象,只会返回bitmap的尺寸
int outWidth和outHeight表示这个Bitmap的宽和高,一般和inJustDecodeBounds一起使用
int inSampleSize压缩图片时采样率的值,如果这个值大于1,按照(1/samplesize)来缩小bitmap的宽高
int inDensity像素密度,对应的是 DisplayMetrics 中的 densityDpi
boolean inDither防抖动,默认为false
boolean inScaled是否可以缩放,默认true
boolean isMutable该属性表示通过decodexxx方法创建的bitmap对象代表的图片是否允许被外部更改,比如利用canvas重新绘制等,默认为false,也就是不可以被修改
inPreferredConfig设置色彩模式,默认采用ARGB_8888
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/571607.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号