Android 如何實(shí)現(xiàn)webp轉(zhuǎn)png忍级?看這篇就夠了

Webp是什么, 請移步 What‘s Webp?

由于webp與生俱有優(yōu)點(diǎn)帆谍,webp如今使用已經(jīng)很廣泛了,包括客戶端轴咱。比如今日頭條客戶端頁面的圖片都是webp格式的汛蝙。客戶端碰到與webp有關(guān)的一些問題嗦玖,大概有:

  • webp圖片的顯示
  • webp轉(zhuǎn)成其他格式圖片
  • 其他格式圖片轉(zhuǎn)成webp

比如我們有一個(gè)這樣的需求:

客戶端將webp格式的圖片轉(zhuǎn)成png后上傳到服務(wù)端(由于服務(wù)端暫時(shí)還不支持webp圖片的上傳)

如何將webp轉(zhuǎn)成png患雇?我們需要依賴Google的webp源碼的支持,但是webp的源碼都是用C來實(shí)現(xiàn)的宇挫,需要將它編譯成.so庫,同時(shí)還需要提供幾個(gè)供Java層調(diào)用的API酪术,用于實(shí)現(xiàn)webp與png相互轉(zhuǎn)換器瘪。在這里我們參考開源項(xiàng)目webp-android-backport

webp-android-backport

下面詳細(xì)說說如何編譯出我們想要的.so庫

1. 將webp-android-backport項(xiàng)目源碼下載至本地后用AS打開

2. webp源碼下載

因?yàn)檫@個(gè)開源項(xiàng)目對于webp的源碼依賴方式是通過git submodule來管理的,如果沒有Google 開發(fā)者賬號(hào)不方便下載绘雁。
還可以通過下面的鏈接獲取源碼


3. 編譯

下載源碼后放置到工程目錄/jni橡疼,進(jìn)行編譯,如圖


認(rèn)真看了開源項(xiàng)目源碼后發(fā)現(xiàn)庐舟,這樣編譯出來的aar庫其實(shí)是有bug的,尷尬??

image.png

為了解決該bug欣除,我們需要將接口類中私有API定義成public,方便上層使用挪略。這里的修改涉及到j(luò)ni的編譯了历帚,期間我也碰到了一些比較坑的問題。(這里我會(huì)用另一篇博客來詳細(xì)說明)
在編譯so庫的時(shí)候杠娱,可以修改webp-android-backport-library包下面的Application.mk文件中APP_ABI 參數(shù)挽牢,來指定項(xiàng)目需要支持的cpu架構(gòu)平臺(tái)。

#APP_ABI := armeabi-v7a x86 armeabi
#APP_ABI := armeabi
APP_ABI := armeabi-v7a
APP_CPPFLAGS := -fno-rtti -fno-exceptions
APP_PLATFORM := android-8

ifndef WEBP_BACKPORT_DEBUG_NATIVE
# Force release compilation in release optimizations, even if application is debuggable by manifest
APP_OPTIM := release
endif

編譯完成會(huì)在webp-android-backport-library/build/outputs目錄下生成一個(gè)aar文件摊求,這樣我們就完成了webp庫的編譯了禽拔。

如何使用編譯生成的庫來實(shí)現(xiàn)webp轉(zhuǎn)png呢?

上代碼:

/**
 * author : J.Chou
 * e-mail : who_know_me@163.com
 * time   : 2018/08/13 10:53 PM
 * version: 1.0
 * description:
 */
public class Webp2PngUtil {

  public static boolean isWebpImage(File imageFile) {
    BitmapFactory.Options options = new BitmapFactory.Options();
    options.inJustDecodeBounds = true;
    BitmapFactory.decodeFile(imageFile.getAbsolutePath(), options);
    String type = options.outMimeType;
    return type.equals("image/webp");
  }

  public static Bitmap webp2Bitmap(String path) {
    Bitmap bitmap = null;
    try {
      bitmap = WebPFactory.nativeDecodeFile(path, null);
    } catch (Throwable t) {
      t.printStackTrace();
    }
    return bitmap;
  }

  @SuppressWarnings("ResultOfMethodCallIgnored")
  public static String bitmap2Png(Bitmap bitmap) {
    if(bitmap == null) return null;
    String pngImagePath = null;
    File pngFile = new File(FileUtil.getCacheDir() + File.separator + "webp2png" + System.currentTimeMillis() + ".png");
    if(pngFile.exists()){
      pngFile.delete();
    }
    FileOutputStream out;
    try{
      out = new FileOutputStream(pngFile);
      if(bitmap.compress(Bitmap.CompressFormat.PNG, 90, out)) {
        out.flush();
        out.close();
      }
      pngImagePath = pngFile.getAbsolutePath();
    } catch (FileNotFoundException e) {
      e.printStackTrace();
    }catch (IOException e) {
      e.printStackTrace();
    }
    return pngImagePath;
  }
}

這個(gè)工具類使用到aar庫中的接口類WebPFactory.
這里簡單說一下上傳圖片的邏輯
先判斷上傳文件(webpFile)是否是webp格式(不能判斷圖片后綴名)室叉,如果是睹栖,則將該文件轉(zhuǎn)成png圖片文件(webpFile ---> pngFile),然后將pngFile上傳到服務(wù)端茧痕。

使用工具類Webp2PngUtil來實(shí)現(xiàn)webp轉(zhuǎn)png的實(shí)例代碼

 if (Webp2PngUtil.isWebpImage(new File(originalImagePath))) {
    String pngImagePath = Webp2PngUtil.bitmap2Png(Webp2PngUtil.webp2Bitmap(originalImagePath));
    if (!TextUtils.isEmpty(pngImagePath)) {
      originalImagePath = pngImagePath;
    }
  }

實(shí)現(xiàn)這樣的需求還是比較容易野来,主要的精力可以會(huì)消耗在aar庫的編譯上。
由于aar中包含了webp的so庫凿渊,而且這個(gè)so庫其實(shí)不小(隨著webp的源碼越來越多梁只,編譯后的so庫也在不斷的增大)缚柳,考慮到APP包的size,支持的cpu架構(gòu)也不能太多搪锣。

極好的參考資料
1. http://www.geekince.com/android/2017/07/31/android-webp-build/
2. http://www.hahack.com/wiki/sundries-webp.html
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末秋忙,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子构舟,更是在濱河造成了極大的恐慌灰追,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件狗超,死亡現(xiàn)場離奇詭異弹澎,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)努咐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進(jìn)店門苦蒿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人渗稍,你說我怎么就攤上這事佩迟。” “怎么了竿屹?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵报强,是天一觀的道長。 經(jīng)常有香客問我拱燃,道長秉溉,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任碗誉,我火速辦了婚禮召嘶,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘诗充。我一直安慰自己苍蔬,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布蝴蜓。 她就那樣靜靜地躺著碟绑,像睡著了一般。 火紅的嫁衣襯著肌膚如雪茎匠。 梳的紋絲不亂的頭發(fā)上格仲,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天,我揣著相機(jī)與錄音诵冒,去河邊找鬼凯肋。 笑死,一個(gè)胖子當(dāng)著我的面吹牛汽馋,可吹牛的內(nèi)容都是我干的侮东。 我是一名探鬼主播圈盔,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼悄雅!你這毒婦竟也來了驱敲?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤宽闲,失蹤者是張志新(化名)和其女友劉穎众眨,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體容诬,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡娩梨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了览徒。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片狈定。...
    茶點(diǎn)故事閱讀 39,696評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖习蓬,靈堂內(nèi)的尸體忽然破棺而出掸冤,到底是詐尸還是另有隱情,我是刑警寧澤友雳,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站铅匹,受9級特大地震影響押赊,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜包斑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一流礁、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧罗丰,春花似錦神帅、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至绍填,卻和暖如春霎桅,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背讨永。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工滔驶, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人卿闹。 一個(gè)月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓揭糕,卻偏偏與公主長得像萝快,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子著角,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評論 2 353

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,072評論 25 707
  • 1揪漩、通過CocoaPods安裝項(xiàng)目名稱項(xiàng)目信息 AFNetworking網(wǎng)絡(luò)請求組件 FMDB本地?cái)?shù)據(jù)庫組件 SD...
    陽明先生_X自主閱讀 15,979評論 3 119
  • 有些時(shí)候心情不好就想一個(gè)人待會(huì),然后反省自己雇寇,想通了就好了氢拥。有時(shí)候就什么都不想,打打籃球锨侯,洗一堆衣服嫩海,收拾好床,用...
    菠蘿鳳梨黑鳳梨閱讀 96評論 0 0
  • 1 你買了新褲子興沖沖打電話讓我看看囚痴。一上車你就迫不及待展示叁怪。“怎么買條這顏色的褲子深滚,可惜了這兩條大長腿奕谭,讓人不忍...
    流失的青春閱讀 984評論 45 57
  • 記得以前臺(tái)灣學(xué)生來上海交流的時(shí)候,我們在聊天時(shí)會(huì)來對比下兩地語言痴荐、文字血柳、生活方式等的不同或是我們共同的興趣,如臺(tái)劇...
    大河小河與一條魚的傳奇閱讀 368評論 0 0