Bitmap篇之初识Bitmap(一)

243 阅读3分钟

初识Bitmap

Bitmap

  • final类,不可继承
  • 图形处理类
  • 可获取图像信息
  • 可对图像剪切、旋转、缩放、压缩
  • 可保存为指定格式图像文件png、jpeg、webp

创建Bitmap

  • Bitmap#createBitmap()
    create_bitmap.png

  • BitmapFactory#decodeXxx()
    decode_bitmap.png

Bitmap色彩模式 Bitmap.Config

表示每个像素点对ARGB通道值的存储方案

  • ALPHA_8
    • 每个像素存储一个透明通道,不存储颜色信息
    • 每个像素占8位(1个字节),色深为8位
    • 对于存储掩码比较有用
  • RGB_565
    • 每个像素占2个字节,只有RGB,其中R(5位)G(6位)B(5位)
    • 可表示2^16种颜色,色深为16位
    • 在不使用透明度时比较有用,常作为一种优化方案,减少内存占用
  • ARGB_4444
    • 每个像素占2个字节,由ARGB组成,每部分4位,共16位(2个字节)
    • 可表示2^16种颜色,色深为16位
    • 该配置图片质量很差,不清晰
  • ARGB_8888
    • 每个像素占4个字节,由ARGB组成,每部分8位,共32位(4个字节)
    • 默认颜色配置,图片质量最好,最占空间,可表示2^24种颜色,色深为32位
  • RGBA_F16
    • 每个像素占8个字节
    • 适用于宽色域和HDR内容
  • HARDWARE
    • 适用于位图只存储在图形内存上
    • 该配置Bitmap不可变,不可作为canvas#drawBitmap参数

Bitmap内存信息API

// bitmap一行像素数
bitmap.width
// bitmap一列像素数
bitmap.height
// bitmap一行字节数,与颜色通道相关(Bitmap.Config.ARGB_8888...)
bitmap.rowBytes
// bitmap所占字节数=rowBytes*height
bitmap.byteCount
// 存储位图像素的已分配内存大小,默认与byteCount相同,重用或手动重新配置后会不同
bitmap.allocationByteCount

色深

Bitmap.Config参数值就是色深,可用来衡量一张图片的色彩处理能力(即色彩丰富度)

位深

记录数字图像颜色时,计算机实际是用每个像素需要的二进制数值位数来表示。是物理硬件参数,主要用来存储

例:某张图片像素200*300,色深32位(ARGB_8888),保存时位深24位,则:

内存占大小:200 * 300 * (32 / 8) Byte

文件占大小:200 * 300 * (24 / 8) * 压缩率 Byte

Bitmap压缩方式

CompressFormat

  • JPEG:以JPEG压缩算法进行图像压缩,格式为jpg或jpeg,有损压缩
  • PNG:以PNG压缩算法进行图像压缩,格式为png,无损压缩
  • WEBP:以WEBP压缩算法进行图像压缩,格式为webp,有损压缩
  • 质量相同情况下,webp比jpeg小40%
  • webp编码时间比jpeg长8倍

Bitmap基本操作

裁剪

  • Bitmap#createBitmap(bitmap, x, y, w, h)

从源bitmap中裁剪
x + w < bitmap.width && y + h < bitmap.height

  • Bitmap#createBitmap(bitmap, x, y, w, h, matrix, filter)

矩阵可进行缩放、旋转、移动
filter为true表示bitmap会被过滤(仅当matrix包含移动+其他操作时适用)

缩放、旋转、移动、倾斜

  • Bitmap#createBitmap(bitmap, x, y, w, h, matrix, filter)
    倾斜Matrix#postSkew不可在创建bitmap时使用
val matrix = Matrix()  
  
// 缩放  
matrix.postScale(0.8f, 0.9f)  
  
// 左旋转45°  
matrix.postRotate(-45)  
  
// 移动  
matrix.postTranslate(100, 80)  
val bitmap = Bitmap.createBitmap(src, 0, 0, src.width, src.height, matrix, true)  

保存和释放

BitmapTool#saveBitmap

BitmapFactory#Options操作图像

Options参数

  • inBitmap:设置会将生成的图像内容加载至bitmap中
  • inDensity:对bitmap设置密度,默认为true,若inDensity与inTargetDensity不匹配,bitmap返回前会将其缩放匹配inTargetDensity
  • inTargetDensity:绘制目标bitmap上的密度
  • inDither:是否做抖动处理,默认false
  • inJustDecodeBounds:设为true表示获取bitmap信息,但不将其像素加载至内存
  • inPreferredConfig:bitmap颜色配置信息,默认Bitmap.Config.ARGB_8888
  • inSampleSize:压缩图像,值一般设为2的整数次幂,当设为2,宽高为原来1/2,图像大小为原来1/4
  • inScaled:是否缩放
  • outHeight:bitmap高度
  • outWidth:bitmap宽度

优化

内存缓存LruCache
磁盘缓存DiskLruCache