前言功能说明图像格式说明接口说明ImageFormat枚举类枚举类FilterModeImageInfoYuvUtils类2.1 Bitmap转换成其余图像格式2.2 各类格式的图像之间互相转换2.3 各类格式的图像转换成Bitmap2.4 各类格式图像的旋转和裁剪操做2.5 各类格式图像通过旋转和裁剪转换成相关Bitmap2.6 各类格式图像的镜面翻转操做2.7 各类格式图像的缩放操做ImageUtilsNV21 格式图像操做I420 格式图像操做git
平常开发中,当涉及到 Android
的 Camera
或者图像相关的开发,或多或少都会接触一些图像格式,这些不一样的格式之间会涉及到各类各样的操做,这里利用 Google
的开源框架 libyuv
封装了一个图像操做库,涉及到了 Android
中经常使用的图像转换操做。github
√支持 RGB_565
、ARGB_8888
、RGB24
、I420
、NV21
5中格式图像之间互相转换操做web
√支持将 Bitmap
转换成以上五种图像格式操做安全
√支持将以上格式的图像转换成 Bitmap
操做app
√支持以上格式图像之间互相旋转裁剪操做框架
√支持以上格式图像之间缩放操做post
√支持以上格式图像之间镜像操做ui
√底层依赖 libyuv
框架,安全、稳定、高效spa
关于图像格式说明可参见这里:Android中经常使用图像格式说明3d
经常使用图像格式转换库地址:ImageUtils
这个类主要用于说明目前支持的数据转换的格式,具体以下:
enum class ImageFormat(var format: Int) {
NV21(1),
I420(2),
RGB_565(3),
RGB_888(4),
ARGB_8888(5)
}
复制代码
关于以上数据格式详细说明,请参见:Android中经常使用图像格式说明
这个枚举类,主要说明对图像进行缩放的时候支持的过滤模式,具体以下:
enum class FilterMode(var filter: Int) {
FilterNone(0),
FilterLinear(1),
FilterBilinear(2),
FilterBox(3)
}
复制代码
关于过滤模式的说明,请参见:filtering.md
这个类主要用于辅助图像数据进行旋转裁剪,具体以下:
class ImageInfo(
val data: ByteArray,
val dataFormat: ImageFormat,
val width: Int,
val height: Int,
@RotateDegree val degree: Int = 0,
val rect: Rect? = null,
val targetFormat: ImageFormat,
val priorityClip: Boolean = true
)
复制代码
具体参数说明以下:
data
:源图像数据dataFormat
:源图像数据格式,支持的格式参见 ImageFormatwidth
:源图像的宽height
:源图像的高degree
:须要旋转的角度rect
:须要裁剪的矩形坐标 Rect
,能够为 null
,表示不进行裁剪targetFormat
:处理后的图像格式,支持的格式参见 ImageFormatpriorityClip
:使用优先裁剪,默认为 ture
,这个参数很重要,后面会说此类为该库的核心类
主要有5个接口:
external fun bitmapToNV21(bitmap: Bitmap?): ByteArray?
external fun bitmapToRgb565(bitmap: Bitmap?): ByteArray?
external fun bitmapToRgb24(bitmap: Bitmap?): ByteArray?
external fun bitmapToRgba(bitmap: Bitmap?): ByteArray?
external fun bitmapToI420(bitmap: Bitmap?): ByteArray?
复制代码
bitmap
,目前仅支持 RGB_565
和 RGBA_8888
两种类型的位图转换external fun imageFormatConvert(
data: ByteArray,
width: Int,
height: Int,
@SupportFormat dataFormat: Int,
@SupportFormat targetFormat: Int
): ByteArray?
复制代码
参数说明:
data
:源图像数据
width
:图像的宽
height
:图像的高
dataFormat
:源图像格式,支持的图像格式,可参见 ImageFormat
枚举类
targetFormat
:须要转换成的图像格式,支持的图像格式,可参见 ImageFormat
枚举类
返回值
:返回转换后的数据
例如一个分辨率为 640 * 480
的 NV21
格式的数据,如今须要将它转换成 RGB24
格式,咱们能够这么调用:
YuvUtils.imageFormatConvert(data, 640, 480, 1, 4)
复制代码
external fun imageToBitmap(
data: ByteArray,
width: Int,
height: Int,
@SupportFormat dataFormat: Int,
bitmapConfig: Int
):Bitmap?
复制代码
参数说明:
data
:源图像数据width
:图像的宽height
:图像的高dataFormat
:源图像格式,支持的图像格式,可参见 ImageFormat
枚举类bitmapConfig
:须要转换成的Bitmap格式,目前仅支持 RGB565
和 ARGB_8888
两种格式的 Bitmap
返回值
:返回转换后的 Bitmap
external fun dataClipRotate(
data: ByteArray,
@SupportFormat dataFormat: Int,
width: Int,
height: Int,
@RotateDegree degree: Int,
rect: Rect?,
targetFormat: Int,
priorityClip: Boolean
): ByteArray?
复制代码
参数说明:
data
:源图像数据dataFormat
:源图像格式,支持的图像格式,可参见 ImageFormat
枚举类width
:图像的宽height
:图像的高degree
:图像旋转的角度,仅支持 0
、90
、180
、270
四个角度rect
:裁剪的矩形坐标,能够为 null
,表示不进行裁剪操做targetFormat
:须要转换成的目标图像格式,支持的图像格式,可参见 ImageFormat
枚举类priorityClip
:是否进行优先裁剪操做,先裁剪再旋转和先旋转再裁剪是两种不一样的操做返回值
:返回转换后的数据例如:
YuvUtils.dataClipRotate(
rgba_data, 5, width, height, 90,
Rect(100, 0, 300, 300), 5, false
)
复制代码
从上面的操做能够看出,priorityClip
的选择其实仍是很重要的!
external fun dataClipRotateToBitmap(
data: ByteArray,
@SupportFormat dataFormat: Int,
width: Int,
height: Int,
@RotateDegree degree: Int,
rect: Rect?,
bitmapConfig: Int,
priorityClip: Boolean
): Bitmap?
复制代码
参数说明:
data
:源图像数据dataFormat
:源图像格式,支持的图像格式,可参见 ImageFormat
枚举类width
:图像的宽height
:图像的高degree
:图像旋转的角度,仅支持 0
、90
、180
、270
四个角度rect
:裁剪的矩形坐标,能够为 null
,表示不进行裁剪操做bitmapConfig
:须要转换成的 Bitmap
格式,目前仅支持 RGB565
和 ARGB_8888
两种格式的 Bitmap
priorityClip
:是否进行优先裁剪操做,先裁剪再旋转和先旋转再裁剪是两种不一样的操做返回值
:返回转换后的 Bitmap
external fun dataMirror(
data: ByteArray,
width: Int,
height: Int,
@SupportFormat dataFormat: Int,
@SupportFormat targetFormat: Int,
isVerticalMirror: Boolean = false
): ByteArray?
复制代码
参数说明:
data
:源图像数据width
:图像的宽height
:图像的高dataFormat
:源图像格式,支持的图像格式,可参见 ImageFormat
枚举类targetFormat
:须要转换成的图像格式,支持的图像格式,可参见 ImageFormat
枚举类isVerticalMirror
:是否执行垂直镜像操做,默认false
,即水平翻转,若为true
,即对图像进行了 180
旋转,而并不是真正的垂直镜像返回值
:返回转换后的数据关于 isVerticalMirror
区别,请看下图:
external fun dataScale(
data: ByteArray,
width: Int,
height: Int,
dstWidth: Int,
dstHeight: Int,
@SupportFormat dataFormat: Int,
@SupportFormat targetFormat: Int,
@SupportFilter filterMode: Int = 0
): ByteArray?
复制代码
参数说明:
data
:源图像数据width
:图像的宽height
:图像的高dstWidth
:目标图像的宽dstHeight
:目标图像的高dataFormat
:源图像格式,支持的图像格式,可参见 ImageFormat
枚举类targetFormat
:须要转换成的图像格式,支持的图像格式,可参见 ImageFormat
枚举类ImageUtils 该类是对 YuvUtils 类的二次包装,以每种图像格式进行操做,方便外界更便捷的调用。
关于 NV21
格式的图像相关操做方法以下:
方法 | 方法说明 |
---|---|
nv21ToI420 |
NV21 格式图像数据转换成 I420 格式的数据 |
nv21ToRgb565 |
NV21 格式图像数据转换成 RGB_565 格式的数据 |
nv21ToRgb24 |
NV21 格式图像数据转换成 RGB24 格式的数据 |
nv21ToRgba |
NV21 格式图像数据转换成 ARGB_8888 格式的数据 |
nv21ToBitmap8888 |
NV21 格式图像数据转换成 ARGB_8888 格式的 Bitmap |
nv21ToBitmap565 |
NV21 格式图像数据转换成 RGB_565 格式的 Bitmap |
nv21Rotate |
NV21 格式图像数据旋转操做 |
nv21Clip |
NV21 格式图像数据裁剪操做 |
nv21Mirror |
NV21 格式图像数据水平镜像操做 |
nv21Scale |
NV21 格式图像数据缩放操做 |
bitmapToNV21 |
将 Bitmap 转换成 NV21 格式数据 |
关于 I420
格式的图像相关操做方法以下:
方法 | 方法说明 |
---|---|
i420ToNV21 |
I420 格式图像数据转换成 NV21 格式的数据 |
i420ToRgb565 |
I420 格式图像数据转换成 RGB_565 格式的数据 |
i420ToRgb24 |
I420 格式图像数据转换成 RGB24 格式的数据 |
i420ToRgba |
I420 格式图像数据转换成 ARGB_8888 格式的数据 |
i420ToBitmap8888 |
I420 格式图像数据转换成 ARGB_8888 格式的 Bitmap |
i420ToBitmap565 |
I420 格式图像数据转换成 RGB_565 格式的 Bitmap |
i420Rotate |
I420 格式图像数据旋转操做 |
i420Clip |
I420 格式图像数据裁剪操做 |
i420Mirror |
I420 格式图像数据水平镜像操做 |
i420Scale |
I420 格式图像数据缩放操做 |
bitmapToI420 |
将 Bitmap 转换成 I420 格式数据 |
RGB24
、RGB_565
以及 ARGB_8888
这三种格式的数据操做跟上面的相关接口方法相似,这里不一一展现了;另外存在的一些接口均为对YuvUtils接口的包装,基本操做都相似,再也不说明。