有没有关于如何在 Android 上使用 WebP 的示例?我试图获取 webp 图像列表并将它们显示在带有 imageview 的列表视图中。
我知道有一个 libwebp api,并且我已经使用 NDK 将它集成到我的 Android 项目中,但是我如何使用 api 来获取我的二进制 webp 并在 imageview 中显示它?
任何帮助都会很棒!
有没有关于如何在 Android 上使用 WebP 的示例?我试图获取 webp 图像列表并将它们显示在带有 imageview 的列表视图中。
我知道有一个 libwebp api,并且我已经使用 NDK 将它集成到我的 Android 项目中,但是我如何使用 api 来获取我的二进制 webp 并在 imageview 中显示它?
任何帮助都会很棒!
将 libwebp 与 NDK 一起使用。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
从项目目录运行。这会生成.so
. /libs/
您可以使用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的内容在这里,它与 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 4.0+ 支持WebP ,也就是 API 级别 14。您可以使用
android.os.Build.VERSION.SDK_INT >= 14
.
我们为此编写了一个 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" />
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 中呈现。
目前无法在 Android 设备上的任何本机应用程序(包括 Web 浏览器)上显示 webp 图像。您必须查看 3rd 方应用程序才能显示这些图像。
根据 WebP 邮件列表,他们正在努力将 WebP 支持整合到 Android SDK 中。他们没有说他们计划什么时候发布这个,但是当他们发布时,你应该能够将位图保存为 WebP 格式以及 JPEG 和 PNG。
编辑:Android 4.0 aka Ice Cream Sandwich 现在自带对 WebP 格式的原生支持。您可以在Android 开发者网站上查看支持的文件类型。