WebP для Android [закрыто]

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

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

любая помощь была бы потрясающей!

5 ответов


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

вот как я заставил его работать:

  1. загрузите NDK, поместите его в систему PATH.
  2. libwebp-0.1.3 скачать.смола.ГЗ, поместите его в 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

здесь контент для Андроид.МК. Изменен от оригинала: удаление битов кодера, как я не нужны, добавил libwebp_java_wrap.c, изменен include $(BUILD_STATIC_LIBRARY) to 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 is здесь, это в основном то же самое, что и в libwebp tarball, за исключением удаленных битов кодировщика.

контент приложение.МК:

# The ARMv7 is significanly faster due to the use of the hardware FPU
APP_ABI := armeabi armeabi-v7a
APP_PLATFORM := android-9

вот как использовать в Java-коде. Обратите внимание, как он преобразует byte [] array to int [] color array--это сломается, если endianness изменится, верно? Также обратите внимание, как он использует массивы вместо целых чисел для ширины и высоты, поэтому они передаются по ссылке.

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

}

WebP является поддерживается для Android 4.0+, a.к. a. Уровень API 14. Вы можете проверить, используя android.os.Build.VERSION >= 14.


мы написали библиотеку Android только для этого.

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

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

webp-android-это адаптация декодера webp chromium и добавление оболочки 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" />

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


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

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

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