WebP para Android
android-ndk (5)
¿Hay ejemplos de cómo usar WebP para Android? Estoy intentando obtener una lista de imágenes webp y mostrarlas en una vista de lista con una vista de imagen.
Sé que hay un api libwebp y lo he integrado en mi proyecto de Android usando el NDK, pero ¿cómo puedo usar el api para tomar mi webp binario y mostrarlo en una vista de imagen?
Cualquier ayuda sería increíble!
Actualmente no hay manera de mostrar una imagen webp en ninguna aplicación nativa en un dispositivo Android, incluido el navegador web. Tendrá que buscar en aplicaciones de terceros para mostrar estas imágenes.
De acuerdo con la lista de correo de WebP, están trabajando para incorporar el soporte de WebP en el SDK de Android. No dijeron cuándo exactamente planean lanzar esto, pero cuando lo hagan, deberían poder guardar mapas de bits en formato WebP, así como JPEG y PNG.
EDIT: Android 4.0 también conocido como Ice Cream Sandwich ahora viene con soporte nativo para el formato WebP. Puede ver los tipos de archivos admitidos en el sitio de desarrolladores de Android .
Google afirma que WebP es compatible a partir de Android 4.0+ ( http://developer.android.com/guide/appendix/media-formats.html ), sin embargo, en nuestras propias pruebas, las imágenes webp se muestran como interrogantes azules tanto en el navegador estándar como en Chrome en Android 4.0 y 4.1. En Android 4.2, las imágenes WebP parecen estar bien representadas en una vista web y en google chrome.
Hemos escrito una biblioteca de Android sólo para eso.
https://github.com/EverythingMe/webp-android
webp-android es una biblioteca que utilizamos en EverythingMe ya que amamos webp. Lo usamos para ahorrar ancho de banda y reducir nuestros tamaños de APK.
webp-android es una adaptación del decodificador webp de chromium, y una adición de un envoltorio JNI para usarlo fácilmente en tu código java. También es fácil cargar imágenes webp desde xml a un ImageView (con el WebpImageView
incluido) así:
<me.everything.webp.WebpImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
webp:webp_src="@drawable/your_webp_image" />
WebP es compatible con Android 4.0+ , también conocido como nivel de API 14. Puede verificar usando android.os.Build.VERSION >= 14
.
Utilice libwebp con NDK. libwebp-0.1.3 ya viene con el archivo Android.mk (obsoleto y con errores de sintaxis, pero aún así). También se generaron enlaces JNI en el directorio /swig/
.
Así es como lo tengo funcionando:
- Descarga NDK, ponlo en el sistema
PATH
. - descargue libwebp-0.1.3.tar.gz, colóquelo en
your_project_dir/jni
- Reemplace
Android.mk
con el de abajo. - Cree
jni/src/libwebp_java_wrap.c
con contenido desde abajo. - cree
jni/Application.mk
, con el contenido de abajo. - ejecuta
ndk-build
desde el directorio del proyecto. Esto genera archivos.so
en/libs/
. Puede inspeccionarlos connm -D libs/armeabi/libwebp.so
. En la lista verá las funciones de la biblioteca nativa (comoWebPDecodeRGB
) y sus contrapartes JNI (comoJava_com_google_webp_libwebpJNI_WebPDecodeRGB
) - Agregue
/jni/swig/libwebp.jar
para crear la ruta de su proyecto de Android - Vea a continuación, por ejemplo, cómo usarlo en el código Java
Aquí está el contenido para Android.mk . Cambiado del original: se eliminaron los bits del codificador porque no los necesito, se agregó libwebp_java_wrap.c
, se modificó include $(BUILD_STATIC_LIBRARY)
para 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)
El contenido para libwebp_java_wrap.c está here , es básicamente el mismo que se incluye en el archivo libwebp tarball, excepto los bits de codificador eliminados.
Contenido para Application.mk :
# The ARMv7 is significanly faster due to the use of the hardware FPU
APP_ABI := armeabi armeabi-v7a
APP_PLATFORM := android-9
Aquí es cómo utilizar en el código de Java. Observe cómo convierte la matriz de bytes [] en la matriz de colores int []; esto se romperá si cambia el endianness, ¿verdad? Observe también cómo utiliza matrices en lugar de enteros únicos para el ancho y la altura, de modo que se pasan por referencia.
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);
}