适用于Android的WebP

Fai*_*bid 21 android android-ndk webp

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

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

任何帮助都会很棒!

Pēt*_*une 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)
Run Code Online (Sandbox Code Playgroud)

内容libwebp_java_wrap.c在这里,它基本上是一样的捆绑libwebp压缩包,除了去除编码器位.

Application.mk的内容:

# The ARMv7 is significanly faster due to the use of the hardware FPU
APP_ABI := armeabi armeabi-v7a
APP_PLATFORM := android-9
Run Code Online (Sandbox Code Playgroud)

以下是如何在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);

}
Run Code Online (Sandbox Code Playgroud)

  • 非常感谢*百万*,伙计们! (3认同)
  • 我已成功使用Pēteris的上述步骤,为最新的WebP src(0.2.0).和Pēteris一样,我不需要编码支持,所以我可以在https://gist.github.com/3719812上找到我更新的Android.mk和libwebp_java_wrap.c (2认同)

bee*_*tra 16

Android 4.0支持 WebP ,即API级别14.您可以使用 android.os.Build.VERSION.SDK_INT >= 14.


Rot*_*miz 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" />
Run Code Online (Sandbox Code Playgroud)