WebP的Android

有没有关于如何使用Android的WebP的例子? 我试图得到一个webp图像列表,并显示在一个列表视图与imageview。

我知道这是一个libwebp API,我已经将它集成到使用NDK的Android项目中,但是我该如何激动地使用API​​来将我的二进制webp显示在imageview中?

任何帮助将是惊人的!

Solutions Collecting From Web of "WebP的Android"

与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. 用下面的代码replaceAndroid.mk
  4. 用下面的内容创buildjni/src/libwebp_java_wrap.c
  5. 用下面的内容创buildjni/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来构buildAndroid项目的path
  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.c的内容在这里 ,它基本上和libwebp tarball捆绑在一起,除了编码器被删除。

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 4.0+ ,又名API级别14.您可以使用android.os.Build.VERSION >= 14进行检查。

我们已经为此写了一个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" /> 

Google声称从Android 4.0+( http://developer.android.com/guide/appendix/media-formats.html )开始支持WebP,但是在我们自己的testing中,webp图像在标准浏览器中显示为蓝色的问号Android 4.0和4.1上的Chrome。 在Android 4.2 WebP图像似乎在web视图和谷歌浏览器中呈现良好。

目前无法在Android设备上的任何本机应用程序(包括networking浏览器)上显示webp图像。 您将不得不查看第三方应用程序来显示这些图像。

根据WebP邮件列表,他们正在将WebP支持整合到Android SDK中。 他们并没有说他们准备什么时候发布这个,但是他们应该能够把位图保存为WebP格式以及JPEG和PNG。

编辑:Android 4.0 aka冰淇淋三明治现在带有本机支持的WebP格式。 您可以在Android开发人员网站上查看受支持的文件types。