WebP для Android

Есть ли примеры использования WebP для Android? Im пытается получить список изображений webp и показать их в listview с изображением.

Я знаю, что theres libwebp api, и я включил его в свой Android-проект, используя NDK, но как я могу использовать api, чтобы взять мой двоичный webp и показать его в образе просмотра?

Любая помощь будет потрясающей!

Ответы

Ответ 1

Используйте libwebp с NDK. libwebp-0.1.3 уже поставляется с файлом Android.mk(устаревшим и с синтаксическими ошибками, но все же). Он также получил сгенерированные привязки JNI в каталоге /swig/.

Вот как я получил работу:

  • Загрузите NDK, поместите его в систему PATH.
  • загрузите libwebp-0.1.3.tar.gz, поместите его в 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.
  • См. ниже, например, как использовать его в 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, кроме удаленных битов кодировщика.

Содержимое 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);

}

Ответ 3

Для этого мы создали библиотеку Android.

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

webp-android - это библиотека, которую мы используем в EverythingMe, так как мы любим webp. Мы используем его для экономии полосы пропускания, а также сокращения размеров APK.

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" />

Ответ 4

Google утверждает, что WebP поддерживается с Android 4.0+ (http://developer.android.com/guide/appendix/media-formats.html), однако в наших собственных тестах веб-изображения отображаются как синие вопросительные знаки как в стандартном браузере, так и в Chrome на Android 4.0 и 4.1. На Android 4.2 изображения WebP кажутся отображаемыми в веб-браузере и в google chrome.

Ответ 5

В настоящее время нет способа отображения веб-изображения на любом родном приложении на устройстве Android, включая веб-браузер. Вам нужно будет посмотреть сторонние приложения, чтобы отображать эти изображения.

Согласно списку рассылки WebP, они работают над включением поддержки WebP в Android SDK. Они не сказали, когда именно они планируют выпустить это, но когда они это сделают, вы должны иметь возможность сохранять растровые изображения в формате WebP, а также JPEG и PNG.

EDIT: Android 4.0 aka Ice Cream Sandwich теперь поставляется с встроенной поддержкой формата WebP. Вы можете просмотреть поддерживаемые типы файлов на сайте разработчика Android.