适用于Android的WebP

时间:2011-08-11 20:53:37

标签: android android-ndk webp

有关于如何使用WebP for Android的任何示例吗?我试图获取一个webp图像列表,并在带有imageview的列表视图中显示它们。

我知道有一个libwebp api并且我已经使用NDK将它集成到我的Android项目中了,但是我如何利用api来获取我的二进制webp并在imageview中显示它?

任何帮助都会很棒!

5 个答案:

答案 0 :(得分:27)

将libwebp与NDK一起使用。 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替换为下面的jni/src/libwebp_java_wrap.c
  4. 使用下方的内容创建jni/Application.mk
  5. 使用以下内容创建ndk-build
  6. 从项目目录运行.so。这会在/libs/中生成nm -D libs/armeabi/libwebp.so个文件。您可以使用WebPDecodeRGB检查它们。在列表中,您将看到本机库函数(如Java_com_google_webp_libwebpJNI_WebPDecodeRGB)及其JNI对应项(如/jni/swig/libwebp.jar
  7. 添加libwebp_java_wrap.c以构建Android项目的路径
  8. 请参阅下面的示例,了解如何在Java代码中使用它
  9. 以下是 Android.mk 的内容。更改为原始版本:删除了编码器位,因为我不需要这些,添加了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)

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

    libwebp_java_wrap.c 的内容为here,它与libwebp tarball中捆绑的内容基本相同,但删除了编码器位。

    Application.mk 的内容:

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

    以下是如何在Java代码中使用。注意它如何将byte []数组转换为int []颜色数组 - 如果字节顺序发生变化,这将会中断,对吧?另请注意它如何使用数组而不是单个整数来表示宽度和高度,以便它们通过引用传递。

    {{1}}

答案 1 :(得分:16)

WebP为supported for Android 4.0+,a.k.a。API级别14.您可以使用 android.os.Build.VERSION.SDK_INT >= 14

答案 2 :(得分:5)

我们为此编写了一个Android库。

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

webp-android是我们在EverythingMe使用的库,因为我们喜欢webp。我们使用它来节省带宽以及缩小我们的APK尺寸。

webp-android是chrome的webp解码器的改编版,并添加了一个JNI包装器,可以在java代码中轻松使用它。 将webp图像从xml加载到ImageView(包含WebpImageView)也很容易,如下所示:

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

答案 3 :(得分:4)

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

答案 4 :(得分:0)

目前无法在Android设备上的任何原生应用上显示网络图片,包括网络浏览器。您必须查看第三方应用才能显示这些图像。

根据WebP邮件列表,他们正致力于将WebP支持整合到Android SDK中。他们没有说明他们究竟何时计划发布这个版本但是当他们这样做时你应该能够将位图保存为WebP格式以及JPEG和PNG。

编辑:Android 4.0又名冰淇淋三明治现在提供对WebP格式的原生支持。您可以在Android developer site找到支持的文件类型。