一万年来谁著史,三千里外欲封侯。这篇文章主要讲述Android Bitmap相关的知识,希望能为你提供帮助。
1. 初识BitmapBitmap是一个final类,因此不能被继承。Bitmap只有一个构造方法,且该构造方法是没有任何访问权限修饰符修饰,也就是说该构造方法是friendly,但是谷歌称Bitmap的构造方法是private(私有的),感觉有点不严谨。不管怎样,一般情况下,我们不能通过构造方法直接新建一个Bitmap对象。
Bitmap是android系统中的图像处理中最重要类之一。Bitmap可以获取图像文件信息,对图像进行剪切、旋转、缩放,压缩等操作,并可以以指定格式保存图像文件。
2. 创建Bitmap对象既然不能直接通过构造方法创建Bitmap,那怎样才能创建Bitmap对象。通常我们可以利用Bitmap的静态方法createBitmap()
和BitmapFactory的decode
系列静态方法创建Bitmap对象。
- Bitmap的静态方法
createBitmap()
文章图片
- BitmapFactory的
decode
系列静态方法
文章图片
Config
和CompressFormat
,Config
是用来设置颜色配置信息的,CompressFormat
是用来设置压缩方式的。文章图片
Config
解析:
通常我们优化Bitmap时,当需要做性能优化或者防止OOM(Out Of Memory),我们通常会使用Bitmap.Config.RGB_565
这个配置,因为Bitmap.Config.ALPHA_8
只有透明度,显示一般图片没有意义,Bitmap.Config.ARGB_4444
显示图片不清楚,Bitmap.Config.ARGB_8888
占用内存最多。
Bitmap.Config.ALPHA_8
:颜色信息只由透明度组成,占8位。
Bitmap.Config.ARGB_4444
:颜色信息由透明度与R(Red),G(Green),B(Blue)四部分组成,每个部分都占4位,总共占16位。
Bitmap.Config.ARGB_8888
:颜色信息由透明度与R(Red),G(Green),B(Blue)四部分组成,每个部分都占8位,总共占32位。是Bitmap默认的颜色配置信息,也是最占空间的一种配置。
Bitmap.Config.RGB_565
:颜色信息由R(Red),G(Green),B(Blue)三部分组成,R占5位,G占6位,B占5位,总共占16位。
CompressFormat
解析:
Bitmap.CompressFormat.JPEG
:表示以JPEG压缩算法进行图像压缩,压缩后的格式可以是".jpg"或者".jpeg",是一种有损压缩。
Bitmap.CompressFormat.PNG
:表示以PNG压缩算法进行图像压缩,压缩后的格式可以是".png",是一种无损压缩。
Bitmap.CompressFormat.WEBP
:表示以WebP压缩算法进行图像压缩,压缩后的格式可以是".webp",是一种有损压缩,质量相同的情况下,WebP格式图像的体积要比JPEG格式图像小40%。美中不足的是,WebP格式图像的编码时间“比JPEG格式图像长8倍”。
Bitmap裁剪图像有两种方式:
Bitmap.createBitmap(Bitmap source, int x, int y, int width, int height)
注意:
x+width
要小于等于source的宽度,y+height
要小于等于source的高度。Bitmap.createBitmap(Bitmap source, int x, int y, int width, int height,Matrix m, boolean filter)
m
和filter
这两个参数,m
是一个Matrix(矩阵)对象,可以进行缩放,旋转,移动等动作,filter
为true时表示source会被过滤,仅仅当m
操作不仅包含移动操作,还包含别的操作时才适用。其实上面的方法本质上就是调用这个方法而已。文章图片
2. Bitmap缩放,旋转,移动图像
Bitmap缩放,旋转,移动,倾斜图像其实就是通过
Bitmap.createBitmap(Bitmap source, int x, int y, int width, int height,Matrix m, boolean filter)
方法实现的,只是在实现这些功能的同时还可以实现图像的裁剪。文章图片
Matrix的
postScale
和postRotate
方法还有多带两个参数的重载方法postScale(float sx, float sy, float px, float py)
和postRotate(float degrees, float px, float py)
,后两个参数px
和py
都表示以该点为中心进行操作。注意:虽然Matrix还可以调用
postSkew
方法进行倾斜操作,但是却不可以在此时创建Bitmap时使用。3. Bitmap保存图像与释放资源
文章图片
5. BitmapFactory通过BitmapFactory.Options对图像进行操作BitmapFactory是通过BitmapFactory.Options对图像进行操作的,然后将操作后的图像生成Bitmap对象或者将操作后的图像用已经存在的Bitmap保存,当不能用之保存时会返回
null
。BitmapFactory.Options中常用的字段有:
文章图片
inBitmap
:如果设置将会将生成的图像内容加载到该Bitmap对象中。
inDensity
:给Bitmap对象设置的密度,如果inScaled
为true(这是默认的),而若inDensity
与inTargetDensity
不匹配,那么就会在Bitmap对象返回前将其缩放到匹配inTargetDensity
。
inDither
:是否对图像进行抖动处理,默认值是false。
inJustDecodeBounds
:如果设置成true,表示获取Bitmap对象信息,但是不将其像素加载到内存。
inPreferredConfig
:Bitmap对象颜色配置信息,默认是Bitmap.Config.ARGB_8888
。
inSampleSize
:对图像进行压缩,设置的值为2的整数次幂或者接近2的整数次幂,当次设置为2时,宽和高为都原来的1/2,图像所占空间为原来的1/4。
inScaled
:设置是否缩放。
inTargetDensity
:绘制到目标Bitmap上的密度。
outHeight
:Bitmap对象的高度。
outWidth
:Bitmap对象的宽度。
文章图片
2. 使用缓存常用的缓存有内存缓存
LruCache
和磁盘缓存DiskLruCache
。Android界面性能调优手册
【Android Bitmap】https://androidtest.org/android-graphics-performance-pattens/?utm_medium=email& utm_source=gank.io
推荐阅读
- Android4.4对于sdcard权限的修改以及兼容性问题
- Android Toast小解
- Canvas: trying to use a recycled bitmap android.graphics.Bitmap@XXX
- Android 4.4.2 动态加入JNI库方法记录 (一 JNI库层)
- [基础架构]PeopleSoft Application Server 重要文件说明
- 在App_Data中创建数据库获取连接串简便方法!
- Android+Handler+Thread 那些事儿
- Android多媒体-MediaPlayer唤醒锁及音频焦点
- Android 用Socket实现PC和手机的文件传输