前言功能說明圖像格式說明接口說明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接口的包裝,基本操做都相似,再也不說明。