歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux基礎 >> Linux技術

Ubuntu下編譯libwebp

項目來來回回換了幾個圖片框架,都不太理想
最後決定選用Glide+libwebp的模式
由於4.0以下Android對Webp的支持並不好
因此需要我們手動支持
1.下載libwebp的最新源碼
下載地址
建議開個代理
2.配置相關
a.將源碼文件夾改名為jni
b.編輯Android.mk文件
開頭加上
[code]#開啟webp 共享庫編譯
ENABLE_SHARED := 1

如圖

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

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

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

4.項目中使用
建立Sample工程
將swig目錄下的libwebp.jar文件和編譯生成的庫文件添加到項目中去
整理的對應的工具類
[code]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
 * 描述:
 * 取自互聯網
 * 修訂: 暫無
 */
public class WebpUtils {

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

    /**
     * 字節數組轉換為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);
    }

    /**
     * 流轉換為字節數組
     * @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的調用
     * @return
     */
    public static int getWebpVersion() {
        return libwebp.WebPGetDecoderVersion();
    }

}

源碼示例地址
Copyright © Linux教程網 All Rights Reserved