Android 安裝包優化】WebP 應用 ( Android 中使用 libwebp.so 庫編碼 WebP 圖片 )

      網友投稿 1045 2022-05-30

      文章目錄

      一、Android 中使用 libwebp.so 庫編碼 WebP 圖片

      二、完整代碼示例

      三、參考資料

      一、Android 中使用 libwebp.so 庫編碼 WebP 圖片

      libwebp.jar 中編碼相關的的方法如下 : libwebpJNI 是 Java 層調用 libwebp.so 動態庫的入口類 ;

      public static byte[] WebPEncodeRGB(byte[] var0, int var1, int var2, int var3, float var4) { return wrap_WebPEncodeRGB(var0, 1, 1, outputSize, var1, var2, var3, var4); } public static byte[] WebPEncodeRGBA(byte[] var0, int var1, int var2, int var3, float var4) { return wrap_WebPEncodeRGBA(var0, 1, 1, outputSize, var1, var2, var3, var4); } public static byte[] WebPEncodeBGR(byte[] var0, int var1, int var2, int var3, float var4) { return wrap_WebPEncodeBGR(var0, 1, 1, outputSize, var1, var2, var3, var4); } public static byte[] WebPEncodeBGRA(byte[] var0, int var1, int var2, int var3, float var4) { return wrap_WebPEncodeBGRA(var0, 1, 1, outputSize, var1, var2, var3, var4); } public static byte[] WebPEncodeLosslessRGB(byte[] var0, int var1, int var2, int var3) { return wrap_WebPEncodeLosslessRGB(var0, 1, 1, outputSize, var1, var2, var3); } public static byte[] WebPEncodeLosslessRGBA(byte[] var0, int var1, int var2, int var3) { return wrap_WebPEncodeLosslessRGBA(var0, 1, 1, outputSize, var1, var2, var3); } public static byte[] WebPEncodeLosslessBGR(byte[] var0, int var1, int var2, int var3) { return wrap_WebPEncodeLosslessBGR(var0, 1, 1, outputSize, var1, var2, var3); } public static byte[] WebPEncodeLosslessBGRA(byte[] var0, int var1, int var2, int var3) { return wrap_WebPEncodeLosslessBGRA(var0, 1, 1, outputSize, var1, var2, var3); }

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      22

      23

      24

      25

      26

      27

      28

      29

      30

      31

      在本博客示例中 , 使用的是 WebPEncodeRGBA 方法 , 傳入的 5 5 5 個參數作用 :

      byte[] var0 : 位圖字節數據 ;

      int var1 : 位圖寬度 , 單位像素 ;

      int var2 : 位圖高度 , 單位像素 ;

      int var3 : 位圖每行的數據字節數 ;

      float var4 : 壓縮 WebP 圖片質量 , 推薦 75 ;

      public static byte[] WebPEncodeRGBA(byte[] var0, int var1, int var2, int var3, float var4) { return wrap_WebPEncodeRGBA(var0, 1, 1, outputSize, var1, var2, var3, var4); }

      1

      2

      3

      使用 libwebp.so 庫編碼 WebP 圖片 : 讀取 R.mipmap.icon_png 資源文件 , 使用 libwebp 編碼為 WebP 圖片 , 保存到本地文件中 ;

      fun libwebpEncode(){ var webPStart = System.currentTimeMillis() // 讀取一張本地圖片 var bitmap = BitmapFactory.decodeResource(resources, R.mipmap.icon_png) // 獲取位圖寬高 var width = bitmap.width var height = bitmap.height // 申請一個 Byte 緩沖區 var byteBuffer: ByteBuffer = ByteBuffer.allocate(bitmap.byteCount) // 將 位圖 數據拷貝到 Byte 緩沖區中 bitmap.copyPixelsToBuffer(byteBuffer) // 使用 libwebp.so 進行 WebP 格式編碼 var data: ByteArray = libwebp.WebPEncodeRGBA( byteBuffer.array(), // 位圖數據 width, // 位圖寬度 height, // 位圖高度 width * 4, // 位圖每行數據 75F // 圖像質量 ) // 將數據寫出到文件中 var fos = FileOutputStream("${cacheDir}/icon_webp2.webp") fos.write(data) fos.close() Log.e(TAG, "使用 libwebp.so 庫編碼 WebP 格式圖片時間 : ${System.currentTimeMillis() - webPStart} ms , " + "輸出文件 : ${cacheDir}/icon_webp2.webp") }

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      22

      23

      24

      25

      26

      27

      28

      29

      30

      二、完整代碼示例

      調用 libweb.jar 中的 libwebp.WebPEncodeRGBA 函數 , 進行 WebP 圖片的編碼操作 ;

      同時測試編碼的時長 ;

      package kim.hsl.webp import android.graphics.Bitmap import android.graphics.BitmapFactory import android.os.Bundle import android.util.Log import androidx.appcompat.app.AppCompatActivity import com.google.webp.libwebp import java.io.FileOutputStream import java.nio.ByteBuffer class MainActivity : AppCompatActivity() { companion object{ val TAG = "MainActivity" init { System.loadLibrary("webp") } } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) Log.e(TAG, "libwebp 函數庫版本 : ${libwebp.WebPGetDecoderVersion()}") // 測試 WebP 解碼速度 decodeWebP() // 測試 WebP 編碼速度 encodeWebP() // 使用 libwebp 庫編碼 WebP 圖片 libwebpEncode() } fun libwebpEncode(){ var webPStart = System.currentTimeMillis() // 讀取一張本地圖片 var bitmap = BitmapFactory.decodeResource(resources, R.mipmap.icon_png) // 獲取位圖寬高 var width = bitmap.width var height = bitmap.height // 申請一個 Byte 緩沖區 var byteBuffer: ByteBuffer = ByteBuffer.allocate(bitmap.byteCount) // 將 位圖 數據拷貝到 Byte 緩沖區中 bitmap.copyPixelsToBuffer(byteBuffer) // 使用 libwebp.so 進行 WebP 格式編碼 var data: ByteArray = libwebp.WebPEncodeRGBA( byteBuffer.array(), // 位圖數據 width, // 位圖寬度 height, // 位圖高度 width * 4, // 位圖每行數據 75F // 圖像質量 ) // 將數據寫出到文件中 var fos = FileOutputStream("${cacheDir}/icon_webp2.webp") fos.write(data) fos.close() Log.e(TAG, "使用 libwebp.so 庫編碼 WebP 格式圖片時間 : ${System.currentTimeMillis() - webPStart} ms , " + "輸出文件 : ${cacheDir}/icon_webp2.webp") } fun encodeWebP(){ // 讀取一張本地圖片 var bitmap = BitmapFactory.decodeResource(resources, R.mipmap.icon_png) var pngStart = System.currentTimeMillis() var fos = FileOutputStream("${cacheDir}/icon_png.png") bitmap.compress(Bitmap.CompressFormat.PNG, 75, fos) fos.close() Log.e(TAG, "編碼 png 格式圖片時間 : ${System.currentTimeMillis() - pngStart} ms , " + "輸出文件 : ${cacheDir}/icon_png.png") var webPStart = System.currentTimeMillis() fos = FileOutputStream("${cacheDir}/icon_webp.webp") bitmap.compress(Bitmap.CompressFormat.WEBP, 75, fos) fos.close() Log.e(TAG, "編碼 WebP 格式圖片時間 : ${System.currentTimeMillis() - webPStart} ms , " + "輸出文件 : ${cacheDir}/icon_webp.webp") } fun decodeWebP(){ var pngStart = System.currentTimeMillis() BitmapFactory.decodeResource(resources, R.mipmap.icon_png) Log.e(TAG, "解碼 png 格式圖片時間 : ${System.currentTimeMillis() - pngStart} ") var webPStart = System.currentTimeMillis() BitmapFactory.decodeResource(resources, R.mipmap.icon_webp) Log.e(TAG, "解碼 WebP 格式圖片時間 : ${System.currentTimeMillis() - webPStart} ") } }

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      22

      23

      24

      25

      26

      27

      28

      29

      30

      31

      32

      33

      34

      35

      36

      37

      38

      39

      40

      41

      42

      43

      44

      45

      46

      47

      48

      49

      50

      51

      52

      53

      54

      55

      56

      57

      58

      59

      60

      61

      62

      63

      64

      65

      66

      67

      68

      69

      70

      71

      72

      73

      74

      75

      76

      77

      78

      79

      80

      81

      82

      83

      84

      85

      86

      87

      88

      89

      90

      91

      92

      93

      94

      95

      96

      執行結果 :

      【Android 安裝包優化】WebP 應用 ( Android 中使用 libwebp.so 庫編碼 WebP 圖片 )

      2021-04-25 13:36:57.719 31716-31757/kim.hsl.webp E/libc: Access denied finding property "vendor.debug.egl.profiler" 2021-04-25 13:36:57.732 31716-31716/kim.hsl.webp E/MainActivity: 動態庫加載完成 2021-04-25 13:36:57.895 31716-31716/kim.hsl.webp E/MainActivity: 1537 2021-04-25 13:36:58.174 31716-31716/kim.hsl.webp E/MainActivity: 解碼 png 格式圖片時間 : 278 2021-04-25 13:36:58.374 31716-31716/kim.hsl.webp E/MainActivity: 解碼 WebP 格式圖片時間 : 200 2021-04-25 13:37:01.053 31716-31716/kim.hsl.webp E/MainActivity: 編碼 png 格式圖片時間 : 2410 ms , 輸出文件 : /data/user/0/kim.hsl.webp/cache/icon_png.png 2021-04-25 13:37:04.130 31716-31716/kim.hsl.webp E/MainActivity: 編碼 WebP 格式圖片時間 : 3077 ms , 輸出文件 : /data/user/0/kim.hsl.webp/cache/icon_webp.webp 2021-04-25 13:37:07.512 31716-31716/kim.hsl.webp E/MainActivity: 使用 libwebp.so 庫編碼 WebP 格式圖片時間 : 3382 ms , 輸出文件 : /data/user/0/kim.hsl.webp/cache/icon_webp2.webp

      1

      2

      3

      4

      5

      6

      7

      8

      使用 libwebp.so 庫編碼 WebP 圖片的速度要 低于 Android 本身自帶 API 的速度 , 由于是為了適配低版本系統 , 聊勝于無 ;

      三、參考資料

      參考文檔 :

      創建 WebP 圖片 : https://developer.android.google.cn/studio/write/convert-webp

      Android 中支持的媒體格式 : https://developer.android.google.cn/guide/topics/media/media-formats

      isparta 工具官網 : http://isparta.github.io/

      isparta 工具 GitHub 地址 : https://github.com/iSparta/iSparta

      Google 提供的 WebP 工具 ( 國內不能訪問 ) : https://developers.google.com/speed/webp/download

      Google WebP 主頁 : https://developers.google.com/speed/webp

      WebP 相關工具下載頁 : https://developers.google.com/speed/webp/download

      WebP工具和函數庫使用文檔 : https://developers.google.com/speed/webp/docs/using

      Android NDK 編譯構建腳本參考文檔 :

      ndk-build 腳本 : https://developer.android.google.cn/ndk/guides/ndk-build

      Android.mk 構建腳本 : https://developer.android.google.cn/ndk/guides/android_mk

      Application.mk 構建腳本 : https://developer.android.google.cn/ndk/guides/application_mk

      博客資源 :

      iSparta 工具 : https://download.csdn.net/download/han1202012/17496041

      Google libwebp 庫 : https://download.csdn.net/download/han1202012/17498155

      libwebp 源碼及編譯相關資源 : https://download.csdn.net/download/han1202012/17826464 ( 源碼 , 編譯腳本 , 編譯結果 so 庫 )

      博客源碼 :

      GitHub 地址 : https://github.com/han1202012/Webp

      CSDN - : https://download.csdn.net/download/han1202012/18125733

      Android

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:YAML學習筆記
      下一篇:C++智能指針及其簡單實現
      相關文章
      精品韩国亚洲av无码不卡区| 亚洲欧美成人综合久久久| 亚洲国产精品尤物YW在线观看| 亚洲欧美一区二区三区日产| 亚洲综合欧美色五月俺也去| 久久亚洲精品国产精品婷婷| 亚洲成人免费在线观看| 亚洲a级成人片在线观看| 亚洲1区1区3区4区产品乱码芒果| 亚洲国产精品专区| 亚洲福利电影在线观看| 亚洲午夜精品在线| 亚洲日本va在线观看| 亚洲色少妇熟女11p| 亚洲av永久无码一区二区三区| 亚洲Aⅴ在线无码播放毛片一线天| 久久精品国产亚洲av品善| 国产精品亚洲一区二区三区在线观看 | 亚洲人成网站观看在线播放| 亚洲精品老司机在线观看| 亚洲麻豆精品国偷自产在线91| 亚洲国产中文v高清在线观看| 亚洲精品无码久久久久AV麻豆| 久久乐国产精品亚洲综合| 国产亚洲成av人片在线观看| 亚洲不卡av不卡一区二区| 亚洲图片一区二区| 91亚洲国产成人久久精品网址| 亚洲va乱码一区二区三区| 亚洲精品无码日韩国产不卡av| 国产精品观看在线亚洲人成网| 亚洲精品成a人在线观看| 亚洲熟女一区二区三区| 久久亚洲国产成人亚| 亚洲国产日产无码精品| 亚洲色大情网站www| 一本久久综合亚洲鲁鲁五月天| 国产亚洲av人片在线观看| 久久久亚洲精品国产| 亚洲一级毛片免观看| 亚洲AV日韩综合一区|