【问题标题】:WebP for Android [closed]适用于 Android 的 WebP [关闭]
【发布时间】:2011-10-25 08:25:52
【问题描述】:

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

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

任何帮助都会很棒!

【问题讨论】:

标签: android android-ndk webp


【解决方案1】:

将 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。这会在/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.c 的内容是here,它与捆绑在 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);

}

【讨论】:

  • 是否有一个示例项目可以演示在 android 上显示 webP 图像,就像您在这里所做的那样?
  • 对于最新的 WebP src (0.2.0),我已经使用 Pēteris 的上述步骤成功地完成了这项工作。和 Pēteris 一样,我不需要编码支持,所以我更新的 Android.mk 和 libwebp_java_wrap.c 可以在 gist.github.com/3719812 获得
  • 为此感谢百万,伙计们!
  • 动画 WEBP 也有东西吗?
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

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

    webp-android 是对 chromium 的 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" />
    

    【讨论】:

    • 你说得对,已编辑。
    • 您创建了一个库很好,但是您能否也创建一个如何添加此库的指南,因为即使我将输出 .aar 文件放到我的项目的库中 - 什么也没有发生。如何让 Android Studio 看到它并算作一个库?
    【解决方案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 中似乎可以正常渲染。

    【讨论】:

    • 他们在那个文档中提到,无损和透明度仅适用于 4.2.1+ 我猜有损图像没有透明度工作 4.0+
    【解决方案5】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2019-10-10
      • 1970-01-01
      • 1970-01-01
      • 2012-11-10
      • 2013-11-10
      • 1970-01-01
      • 1970-01-01
      • 2011-07-15
      • 2010-11-19
      相关资源
      最近更新 更多