【Android】一款經常使用的圖像轉換操做庫

前言功能說明圖像格式說明接口說明ImageFormat枚舉類枚舉類FilterModeImageInfoYuvUtils類2.1 Bitmap轉換成其餘圖像格式2.2 各類格式的圖像之間互相轉換2.3 各類格式的圖像轉換成Bitmap2.4 各類格式圖像的旋轉和裁剪操做2.5 各類格式圖像通過旋轉和裁剪轉換成相關Bitmap2.6 各類格式圖像的鏡面翻轉操做2.7 各類格式圖像的縮放操做ImageUtilsNV21 格式圖像操做I420 格式圖像操做git


前言

平常開發中,當涉及到 AndroidCamera 或者圖像相關的開發,或多或少都會接觸一些圖像格式,這些不一樣的格式之間會涉及到各類各樣的操做,這裏利用 Google 的開源框架 libyuv 封裝了一個圖像操做庫,涉及到了 Android 中經常使用的圖像轉換操做。github


功能說明

    支持 RGB_565ARGB_8888RGB24I420NV21 5中格式圖像之間互相轉換操做web

    支持將 Bitmap 轉換成以上五種圖像格式操做安全

    支持將以上格式的圖像轉換成 Bitmap 操做app

    支持以上格式圖像之間互相旋轉裁剪操做框架

    支持以上格式圖像之間縮放操做post

    支持以上格式圖像之間鏡像操做ui

    底層依賴 libyuv 框架,安全、穩定、高效spa


圖像格式說明

關於圖像格式說明可參見這裏:Android中經常使用圖像格式說明3d

接口說明

經常使用圖像格式轉換庫地址:ImageUtils

ImageFormat枚舉類

這個類主要用於說明目前支持的數據轉換的格式,具體以下:

enum class ImageFormat(var format: Int) {
    NV21(1),
    I420(2),
    RGB_565(3),
    RGB_888(4),
    ARGB_8888(5)
}
複製代碼

關於以上數據格式詳細說明,請參見:Android中經常使用圖像格式說明


枚舉類FilterMode

這個枚舉類,主要說明對圖像進行縮放的時候支持的過濾模式,具體以下:

enum class FilterMode(var filter: Int) {
    FilterNone(0),
    FilterLinear(1),
    FilterBilinear(2),
    FilterBox(3)
}
複製代碼

關於過濾模式的說明,請參見:filtering.md


ImageInfo

這個類主要用於輔助圖像數據進行旋轉裁剪,具體以下:

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:源圖像數據格式,支持的格式參見 ImageFormat
  • width:源圖像的寬
  • height:源圖像的高
  • degree:須要旋轉的角度
  • rect:須要裁剪的矩形座標 Rect,能夠爲 null ,表示不進行裁剪
  • targetFormat:處理後的圖像格式,支持的格式參見 ImageFormat
  • priorityClip:使用優先裁剪,默認爲 ture,這個參數很重要,後面會說

YuvUtils類

此類爲該庫的核心類

2.1 Bitmap轉換成其餘圖像格式

主要有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_565RGBA_8888 兩種類型的位圖轉換

2.2 各類格式的圖像之間互相轉換

external fun imageFormatConvert(
    dataByteArray,
    width: Int,
    height: Int,
    @SupportFormat dataFormat: Int,
    @SupportFormat targetFormat: Int
)
: ByteArray?
複製代碼

參數說明:

  • data:源圖像數據

  • width:圖像的寬

  • height:圖像的高

  • dataFormat:源圖像格式,支持的圖像格式,可參見 ImageFormat 枚舉類

  • targetFormat:須要轉換成的圖像格式,支持的圖像格式,可參見 ImageFormat 枚舉類

  • 返回值:返回轉換後的數據

    例如一個分辨率爲 640 * 480NV21 格式的數據,如今須要將它轉換成 RGB24 格式,咱們能夠這麼調用:

YuvUtils.imageFormatConvert(data64048014)
複製代碼

2.3 各類格式的圖像轉換成Bitmap

external fun imageToBitmap(
    dataByteArray,
    width: Int,
    height: Int,
    @SupportFormat dataFormat: Int,
    bitmapConfig: Int
)
:Bitmap?
複製代碼

參數說明:

  • data:源圖像數據
  • width:圖像的寬
  • height:圖像的高
  • dataFormat:源圖像格式,支持的圖像格式,可參見 ImageFormat 枚舉類
  • bitmapConfig:須要轉換成的Bitmap格式,目前僅支持 RGB565ARGB_8888 兩種格式的 Bitmap
  • 返回值:返回轉換後的 Bitmap

2.4 各類格式圖像的旋轉和裁剪操做

external fun dataClipRotate(
    dataByteArray,
    @SupportFormat dataFormat: Int,
    width: Int,
    height: Int,
    @RotateDegree degree: Int,
    rect: Rect?,
    targetFormat: Int,
    priorityClip: Boolean
)
: ByteArray?
複製代碼

參數說明:

  • data:源圖像數據
  • dataFormat:源圖像格式,支持的圖像格式,可參見 ImageFormat 枚舉類
  • width:圖像的寬
  • height:圖像的高
  • degree:圖像旋轉的角度,僅支持 090180270 四個角度
  • rect:裁剪的矩形座標,能夠爲 null,表示不進行裁剪操做
  • targetFormat:須要轉換成的目標圖像格式,支持的圖像格式,可參見 ImageFormat 枚舉類
  • priorityClip:是否進行優先裁剪操做,先裁剪再旋轉和先旋轉再裁剪是兩種不一樣的操做
  • 返回值:返回轉換後的數據

例如:

YuvUtils.dataClipRotate(
            rgba_data, 5, width, height, 90,
            Rect(1000300300), 5false
        )
複製代碼
image
image

從上面的操做能夠看出,priorityClip的選擇其實仍是很重要的!

2.5 各類格式圖像通過旋轉和裁剪轉換成相關Bitmap

external fun dataClipRotateToBitmap(
    dataByteArray,
    @SupportFormat dataFormat: Int,
    width: Int,
    height: Int,
    @RotateDegree degree: Int,
    rect: Rect?,
    bitmapConfig: Int,
    priorityClip: Boolean
)
: Bitmap?
複製代碼

參數說明:

  • data:源圖像數據
  • dataFormat:源圖像格式,支持的圖像格式,可參見 ImageFormat 枚舉類
  • width:圖像的寬
  • height:圖像的高
  • degree:圖像旋轉的角度,僅支持 090180270 四個角度
  • rect:裁剪的矩形座標,能夠爲 null,表示不進行裁剪操做
  • bitmapConfig:須要轉換成的 Bitmap 格式,目前僅支持 RGB565ARGB_8888 兩種格式的 Bitmap
  • priorityClip:是否進行優先裁剪操做,先裁剪再旋轉和先旋轉再裁剪是兩種不一樣的操做
  • 返回值:返回轉換後的 Bitmap

2.6 各類格式圖像的鏡面翻轉操做

external fun dataMirror(
    dataByteArray,
    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 區別,請看下圖:

image
image

2.7 各類格式圖像的縮放操做

external fun dataScale(
    dataByteArray,
    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

ImageUtils 該類是對 YuvUtils 類的二次包裝,以每種圖像格式進行操做,方便外界更便捷的調用。

NV21 格式圖像操做

關於 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 格式圖像操做

關於 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 格式數據

RGB24RGB_565 以及 ARGB_8888 這三種格式的數據操做跟上面的相關接口方法相似,這裏不一一展現了;另外存在的一些接口均爲對YuvUtils接口的包裝,基本操做都相似,再也不說明。

相關文章
相關標籤/搜索