2011-08-11 18 views
17

有沒有關於如何使用WebP for Android的例子?我試圖獲得一個webp圖像列表,並用imageview的listview顯示它們。WebP for Android

我知道這是一個libwebp API,我已經使用NDK將它集成到了我的Android項目中,但我該如何激動地使用API​​來使用我的二進制webp並在imageview中顯示它?

任何幫助將是驚人的!

+1

封閉,題外話了平時完全陳腐而愚蠢的理由。如果它繼續下去,這個瘋狂的膝蓋混亂的事件將會導致堆棧溢出。 – barneypitt

+0

關於Android Studio 2.3+,您現在可以直接將圖像轉換爲webp圖像 https://developer.android.com/studio/write/convert-webp.html – datBoy

回答

23

在NDK中使用libwebp。 libwebp-0.1.3已經附帶Android.mk文件(過時並且有語法錯誤,但仍然存在)。它還在/swig/目錄中生成了JNI綁定。

這裏就是我得到了它的工作:

  1. 下載NDK,把它放在系統PATH
  2. 下載libwebp-0.1.3.tar.gz,將其放置在your_project_dir/jni
  3. 更換Android.mk與下面的一個。
  4. 使用下面的內容創建jni/src/libwebp_java_wrap.c
  5. 創建jni/Application.mk,內容來自下方。
  6. 從項目目錄運行ndk-build。這會在/libs/中生成.so文件。你可以用nm -D libs/armeabi/libwebp.so來檢查它們。在列表中,你會同時看到本機庫函數(如WebPDecodeRGB)及其JNI同行(如Java_com_google_webp_libwebpJNI_WebPDecodeRGB
  7. 添加/jni/swig/libwebp.jar建立自己的Android項目的路徑
  8. 請參見下面的示例演示如何在Java代碼中使用它

下面是Android.mk內容。從原來的變化:刪除編碼器位,因爲我不需要這些,添加libwebp_java_wrap.c,更改include $(BUILD_STATIC_LIBRARY)include $(BUILD_SHARED_LIBRARY)

LOCAL_PATH:= $(call my-dir) 

include $(CLEAR_VARS) 
LOCAL_SRC_FILES := \ 
    src/dec/alpha.c \ 
    src/dec/frame.c \ 
    src/dec/idec.c \ 
    src/dec/layer.c \ 
    src/dec/quant.c \ 
    src/dec/tree.c \ 
    src/dec/vp8.c \ 
    src/dec/webp.c \ 
    src/dec/io.c \ 
    src/dec/buffer.c \ 
    src/dsp/yuv.c \ 
    src/dsp/upsampling.c \ 
    src/dsp/cpu.c \ 
    src/dsp/dec.c \ 
    src/dsp/dec_neon.c \ 
    src/dsp/enc.c \ 
    src/utils/bit_reader.c \ 
    src/utils/bit_writer.c \ 
    src/utils/thread.c \ 
    src/libwebp_java_wrap.c \ 

LOCAL_CFLAGS := -Wall -DANDROID -DHAVE_MALLOC_H -DHAVE_PTHREAD -DWEBP_USE_THREAD \ 
       -finline-functions -frename-registers -ffast-math \ 
       -s -fomit-frame-pointer -Isrc/webp 

LOCAL_C_INCLUDES += $(LOCAL_PATH)/src 

LOCAL_MODULE:= webp 

include $(BUILD_SHARED_LIBRARY) 

內容libwebp_java_wrap.chere,它基本上相同捆綁libwebp壓縮包,除了除去編碼器比特。

內容Application.mk

# The ARMv7 is significanly faster due to the use of the hardware FPU 
APP_ABI := armeabi armeabi-v7a 
APP_PLATFORM := android-9 

下面介紹如何在Java代碼中使用。注意它如何將byte []數組轉換爲int []顏色數組 - 如果endianness更改,它會中斷,對不對?另請注意,它是如何使用數組而不是單個整數的寬度和高度,以便它們通過引用傳遞。

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

private 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); 

} 
+0

是否有示例項目演示如何顯示webP Android上的圖像,就像你在這裏做的一樣? –

+1

我已經使用Pēteris的上述步驟成功地獲得了這個工作,用於最新的WebP src(0.2.0)。像Pēteris一樣,我不需要編碼支持,所以我更新的Android.mk和libwebp_java_wrap.c可以在https://gist.github.com/3719812 –

+2

上得到,感謝*百萬*這個,夥計! – geomaster

0

目前無法在Android設備上的任何本機應用程序(包括網絡瀏覽器)上顯示webp圖像。您必須查看第三方應用才能顯示這些圖像。

根據WebP郵件列表,他們正在將WebP支持整合到Android SDK中。他們並沒有說他們準備發佈這個時間,但是當他們這樣做時,你應該能夠將位圖保存爲WebP格式以及JPEG和PNG。

編輯:Android 4.0又名冰淇淋三明治現在帶有原生支持WebP格式。您可以在Android developer site處看到支持的文件類型。

3

谷歌稱,WebP的是從Android的支持開始4.0+(http://developer.android.com/guide/appendix/media-formats.html),但是在我們自己的測試WEBP圖片顯示無論是在標準瀏覽器和Chrome在Android 4.0和4.1的藍色questionmarks。 在Android 4.2上,WebP圖像似乎在web視圖和Google Chrome中呈現良好狀態。

+1

他們提到該文檔,無損和透明度只適用於4.2.1+我猜有損圖像沒有透明度工作4.0+ –

4

我們已經爲此編寫了一個Android庫。

https://github.com/EverythingMe/webp-android

WEBP,Android是我們在EverythingMe使用,因爲我們愛WEBP庫。我們使用它來節省帶寬以及縮小我們的APK大小。

webp-android是鉻的webp解碼器的改編版,並且增加了一個JNI包裝器,可以在Java代碼中輕鬆使用它。 它也很容易從XML加載圖像WEBP到ImageView的(使用附帶的WebpImageView),像這樣:

<me.everything.webp.WebpImageView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    webp:webp_src="@drawable/your_webp_image" /> 
+0

你是對的,編輯。 – Rotemmiz

+0

多數民衆贊成在你創建一個圖書館,但是,請你也請創建一個指南如何添加這個圖書館,因爲即使我把輸出.aar文件到我的項目庫 - 沒有真正發生。如何讓Android Studio查看它並算作圖書館? – careful7j