24

有没有关于如何在 Android 上使用 WebP 的示例?我试图获取 webp 图像列表并将它们显示在带有 imageview 的列表视图中。

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

任何帮助都会很棒!

4

5 回答 5

28

将 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下面那个。
  4. 使用下面的内容创建jni/src/libwebp_java_wrap.c
  5. 创建jni/Application.mk, 内容来自下方。
  6. ndk-build从项目目录运行。这会生成.so. /libs/您可以使用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.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[] 颜色数组的——如果字节序改变,这会中断,对吧?还要注意它如何使用数组而不是单个整数来表示宽度和高度,因此它们是通过引用传递的。

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

}
于 2011-12-07T21:19:21.153 回答
16

Android 4.0+ 支持WebP ,也就是 API 级别 14。您可以使用 android.os.Build.VERSION.SDK_INT >= 14.

于 2011-11-21T23:20:58.023 回答
5

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

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

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

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

<me.everything.webp.WebpImageView
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  webp:webp_src="@drawable/your_webp_image" />
于 2015-09-17T12:11:01.863 回答
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 和 google chrome 中呈现。

于 2013-03-04T14:37:38.610 回答
0

目前无法在 Android 设备上的任何本机应用程序(包括 Web 浏览器)上显示 webp 图像。您必须查看 3rd 方应用程序才能显示这些图像。

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

编辑:Android 4.0 aka Ice Cream Sandwich 现在自带对 WebP 格式的原生支持。您可以在Android 开发者网站上查看支持的文件类型。

于 2011-10-03T17:19:34.033 回答