ubuntu移植libwebp到Android平臺

目錄

1.簡介

Webp圖片格式是google官方推出的一種圖片格式,相比傳統(tǒng)的jpeg格式,可以節(jié)約1/3的流量,因此在做大量使用圖片的App時,益處多多。
而此前項(xiàng)目來來回回?fù)Q了幾個圖片框架,都不太理想
最后決定選用Glide+libwebp的模式
由于4.0以下Android對Webp的支持并不好,因此需要我們手動支持。

2.源碼配置

libwebp的最新源碼
建議開個代理
將源碼文件夾改名為jni
編輯Android.mk文件,開頭加上

#開啟webp 共享庫編譯
ENABLE_SHARED := 1

如圖



添加swig/libwebp_java_wrap.c文件到Android.mk中



添加Application.mk文件
APP_ABI := armeabi armeabi-v7a
APP_PLATFORM := android-8

3.編譯生成

此時可以使用ndk-build命令編譯



項(xiàng)目中使用
建立Sample工程
將swig目錄下的libwebp.jar文件和編譯生成的庫文件添加到項(xiàng)目中去
整理的對應(yīng)的工具類

package com.webp.lib;

import android.graphics.Bitmap;

import com.google.webp.libwebp;

import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.nio.ByteBuffer;

/**
 * 作者: andy
 * 時間: 16-4-8
 * 描述:
 * 取自互聯(lián)網(wǎng)
 * 修訂: 暫無
 */
public class WebpUtils {

    static {
        System.loadLibrary("webp");
    }

    /**
     * 字節(jié)數(shù)組轉(zhuǎn)換為bitmap對象
     *
     * @param encoded
     * @return
     */
    public static Bitmap webpToBitmap(byte[] encoded) {
        int[] width = new int[]{0};
        int[] height = new int[]{0};
        byte[] decoded = libwebp.WebPDecodeARGB(encoded, encoded.length, width,
                height);

        int[] pixels = new int[decoded.length / 4];
        ByteBuffer.wrap(decoded).asIntBuffer().get(pixels);

        return Bitmap.createBitmap(pixels, width[0], height[0],
                Bitmap.Config.ARGB_8888);
    }

    /**
     * 流轉(zhuǎn)換為字節(jié)數(shù)組
     * @param in
     * @return
     */
    public static byte[] streamToBytes(InputStream in) {
        ByteArrayOutputStream out = new ByteArrayOutputStream(1024);
        byte[] buffer = new byte[1024];
        int len = -1;
        try {
            while ((len = in.read(buffer)) >= 0) {
                out.write(buffer, 0, len);
                out.flush();
            }
        } catch (java.io.IOException e) {
            e.printStackTrace();
        } finally {
            try {
                in.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return out.toByteArray();
    }

    public static boolean isWebp(byte[] data) {
        return data != null && data.length > 12 && data[0] == 'R'
                && data[1] == 'I' && data[2] == 'F' && data[3] == 'F'
                && data[8] == 'W' && data[9] == 'E' && data[10] == 'B'
                && data[11] == 'P';
    }

    /**
     * 獲取webp版本
     * 用來測試JNI的調(diào)用
     * @return
     */
    public static int getWebpVersion() {
        return libwebp.WebPGetDecoderVersion();
    }

}

效果如圖所示



使用Geeymotion的模擬器2.3.7成功加載webp圖片

4.示例源碼地址

https://github.com/byhook/WebpSample

5.參考

官方使用FAQ

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,901評論 25 709
  • 一.榜單介紹 排行榜包括四大類: 單一框架:僅提供路由、網(wǎng)絡(luò)層、UI層、通信層或其他單一功能的框架 混合開發(fā)框架:...
    偉子男閱讀 5,356評論 0 161
  • 唯一值得安慰的是,還有初中同學(xué)仔一直聚會不散。除了初中,其他都散了。而我的起點(diǎn),我的轉(zhuǎn)變,我的榮譽(yù),我最好的朋友,...
    待我長發(fā)及背_閱讀 217評論 0 0
  • 好像我能說的話特別有限。 有時候聽到有人因我失眠的話 也不為所動 有時候希望事情早點(diǎn)塵埃落定 我、也不用再為誰擔(dān)心...
    Ncto閱讀 210評論 0 1

友情鏈接更多精彩內(nèi)容