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 в .
вот как я заставил его работать:
- загрузите NDK, поместите его в систему
PATH
. - libwebp-0.1.3 скачать.смола.ГЗ, поместите его в
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
здесь контент для Андроид.МК. Изменен от оригинала: удаление битов кодера, как я не нужны, добавил 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.