2011-08-11 12 views
17

¿Hay algún ejemplo sobre cómo usar WebP para Android? Estoy tratando de obtener una lista de imágenes web y mostrarlas en una vista de lista con una imagen.WebP para Android

Sé que hay una aplicación libwebp y la he integrado en mi proyecto de Android utilizando el NDK, pero ¿cómo puedo utilizar excactamente la API para tomar mi WebP binario y mostrarlo en una vista de imagen?

¡Cualquier ayuda sería increíble!

+1

cerrada como fuera de tema por las razones completamente trilladas y estúpidos habituales. Esta oficiosidad instintiva matará el desbordamiento de la pila si continúa. – barneypitt

+0

En lates Android studio 2.3+, ahora puede convertir sus imágenes directamente en imágenes web https://developer.android.com/studio/write/convert-webp.html – datBoy

Respuesta

23

Usa 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 obtuvo enlaces JNI generados en el directorio /swig/.

Así es como lo tengo trabajo:

  1. Descargar NDK, lo puso en el sistema PATH.
  2. descarga libwebp-0.1.3.tar.gz, colocarlo en your_project_dir/jni
  3. Reemplazar Android.mk con la de abajo.
  4. Crea jni/src/libwebp_java_wrap.c con contenido de abajo.
  5. crear jni/Application.mk, con contenido desde abajo.
  6. ejecuta ndk-build desde el directorio del proyecto. Esto genera .so archivos en /libs/. Puede inspeccionarlos con nm -D libs/armeabi/libwebp.so. En la lista verá tanto las funciones de biblioteca nativa (como WebPDecodeRGB) y sus homólogos JNI (como Java_com_google_webp_libwebpJNI_WebPDecodeRGB)
  7. Añadir /jni/swig/libwebp.jar para construir camino de su proyecto Android
  8. Véase más adelante, por ejemplo, cómo usarlo en código Java

Contenido para Android.mk. Se modificó desde el original: se eliminaron los bits del codificador ya que no los necesito, se agregó libwebp_java_wrap.c, se cambió include $(BUILD_STATIC_LIBRARY) a 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) 

contenido de libwebp_java_wrap.c es here, es básicamente el mismo que el archivo tar incluido en libwebp, excepto los bits del codificador retirados.

contenido de 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 código Java. Observe cómo convierte byte [] array a int [] color array - esto se romperá si la endianidad cambia, ¿verdad? También observe cómo utiliza matrices en lugar de números enteros para el ancho y la altura, por lo 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); 

} 
+0

hay un proyecto de muestra que muestra la demostración de un webP imagen en Android, como has hecho aquí? –

+1

Lo he conseguido con éxito utilizando los pasos anteriores de Pēteris, para la última WebP src (0.2.0). Como Pēteris, no necesitaba soporte de codificación, así que mi Android.mk actualizado y libwebp_java_wrap.c están disponibles en https://gist.github.com/3719812 –

+2

¡Gracias a * millones * por esto, chicos! – geomaster

0

Actualmente no hay forma de mostrar una imagen web en cualquier 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 exactamente cuándo planean lanzar esto, pero cuando lo hagan, deberían poder guardar bitmaps como formato WebP, así como JPEG y PNG.

EDITAR: Android 4.0 aka Ice Cream Sandwich ahora viene con soporte nativo para el formato WebP. Puede ver los tipos de archivos compatibles en el Android developer site.

3

Google afirma que WebP es soportado a partir de Android 4.0 o superior (http://developer.android.com/guide/appendix/media-formats.html), sin embargo, en nuestras propias pruebas webp imágenes muestran questionmarks como azules, tanto en el navegador estándar y Chrome en Android 4.0 y 4.1. En Android 4.2, las imágenes WebP parecen estar correctas en una vista web y en google chrome.

+1

Mencionan en ese documento, Lossless y la transparencia solo funcionan en 4.2.1+ Supongo que las imágenes con pérdida sin transparencia funcionan 4.0+ –

4

Hemos escrito una biblioteca de Android solo para eso.

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

webp-androide es una biblioteca que utilizamos en EverythingMe ya que nos encanta webp. Lo utilizamos para ahorrar ancho de banda y reducir nuestros tamaños de APK.

webp-android es una adaptación del decodificador webp de cromo, y una adición de un envoltorio JNI para usarlo fácilmente en su código java. También es fácil de cargar webp imágenes de XML a un ImageView (con la WebpImageView incluido), así:

<me.everything.webp.WebpImageView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    webp:webp_src="@drawable/your_webp_image" /> 
+0

Tienes razón, editadas. – Rotemmiz

+0

Es bueno que haya creado una biblioteca, sin embargo, podría también crear una guía sobre cómo agregar esta biblioteca, ya que incluso si pongo el archivo .aar de salida en libs de mi proyecto, en realidad no sucede nada. ¿Cómo hacer que Android Studio lo vea y cuente como una biblioteca? – careful7j