有沒有關於如何使用WebP for Android的例子?我試圖獲得一個webp圖像列表,並用imageview的listview顯示它們。WebP for Android
我知道這是一個libwebp API,我已經使用NDK將它集成到了我的Android項目中,但我該如何激動地使用API來使用我的二進制webp並在imageview中顯示它?
任何幫助將是驚人的!
有沒有關於如何使用WebP for Android的例子?我試圖獲得一個webp圖像列表,並用imageview的listview顯示它們。WebP for Android
我知道這是一個libwebp API,我已經使用NDK將它集成到了我的Android項目中,但我該如何激動地使用API來使用我的二進制webp並在imageview中顯示它?
任何幫助將是驚人的!
在NDK中使用libwebp。 libwebp-0.1.3已經附帶Android.mk文件(過時並且有語法錯誤,但仍然存在)。它還在/swig/
目錄中生成了JNI綁定。
這裏就是我得到了它的工作:
PATH
。your_project_dir/jni
Android.mk
與下面的一個。jni/src/libwebp_java_wrap.c
。jni/Application.mk
,內容來自下方。ndk-build
。這會在/libs/
中生成.so
文件。你可以用nm -D libs/armeabi/libwebp.so
來檢查它們。在列表中,你會同時看到本機庫函數(如WebPDecodeRGB
)及其JNI同行(如Java_com_google_webp_libwebpJNI_WebPDecodeRGB
)/jni/swig/libwebp.jar
建立自己的Android項目的路徑下面是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.c是here,它基本上相同捆綁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);
}
是否有示例項目演示如何顯示webP Android上的圖像,就像你在這裏做的一樣? –
我已經使用Pēteris的上述步驟成功地獲得了這個工作,用於最新的WebP src(0.2.0)。像Pēteris一樣,我不需要編碼支持,所以我更新的Android.mk和libwebp_java_wrap.c可以在https://gist.github.com/3719812 –
上得到,感謝*百萬*這個,夥計! – geomaster
目前無法在Android設備上的任何本機應用程序(包括網絡瀏覽器)上顯示webp圖像。您必須查看第三方應用才能顯示這些圖像。
根據WebP郵件列表,他們正在將WebP支持整合到Android SDK中。他們並沒有說他們準備發佈這個時間,但是當他們這樣做時,你應該能夠將位圖保存爲WebP格式以及JPEG和PNG。
編輯:Android 4.0又名冰淇淋三明治現在帶有原生支持WebP格式。您可以在Android developer site處看到支持的文件類型。
WebP是supported for Android 4.0+,又名API級別14.您可以使用 android.os.Build.VERSION >= 14
進行檢查。
谷歌稱,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中呈現良好狀態。
他們提到該文檔,無損和透明度只適用於4.2.1+我猜有損圖像沒有透明度工作4.0+ –
我們已經爲此編寫了一個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" />
封閉,題外話了平時完全陳腐而愚蠢的理由。如果它繼續下去,這個瘋狂的膝蓋混亂的事件將會導致堆棧溢出。 – barneypitt
關於Android Studio 2.3+,您現在可以直接將圖像轉換爲webp圖像 https://developer.android.com/studio/write/convert-webp.html – datBoy