Existe-t-il des exemples d'utilisation de WebP pour Android? J'essaie d'obtenir une liste d'images WebP et de les afficher dans une liste avec une image.
Je connais une API libwebp et je l'ai intégrée à mon projet Android à l'aide du NDK, mais comment puis-je utiliser l'api de manière excatrice pour prendre mon webp binaire et l'afficher dans une imageview?
Toute aide serait incroyable!
Utilisez libwebp avec NDK. Libwebp-0.1.3 est déjà livré avec le fichier Android.mk (obsolète et avec des erreurs de syntaxe, mais quand même). Il a également obtenu des liaisons JNI générées dans le répertoire /swig/
.
Voici comment je l'ai fait fonctionner:
PATH
.your_project_dir/jni
Android.mk
par celui ci-dessous. jni/src/libwebp_Java_wrap.c
avec le contenu ci-dessous.jni/Application.mk
, avec le contenu ci-dessous.ndk-build
à partir du répertoire du projet. Cela génère des fichiers .so
dans /libs/
. Vous pouvez les inspecter avec nm -D libs/armeabi/libwebp.so
. Dans la liste, vous verrez à la fois les fonctions de bibliothèque natives (telles que WebPDecodeRGB
) et leurs équivalents JNI (telles que Java_com_google_webp_libwebpJNI_WebPDecodeRGB
)./jni/swig/libwebp.jar
pour construire le chemin de votre projet AndroidVoici le contenu de Android.mk . Modifié à partir de l'original: bits de codeur supprimés car je n'en ai pas besoin, ajouté libwebp_Java_wrap.c
, changé include $(BUILD_STATIC_LIBRARY)
en 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)
Le contenu de libwebp_Java_wrap.c est ici , il est fondamentalement identique à celui fourni dans l'archive libwebp, sauf que les bits de l'encodeur ont été supprimés.
Contenu pour Application.mk :
# The ARMv7 is significanly faster due to the use of the hardware FPU
APP_ABI := armeabi armeabi-v7a
APP_PLATFORM := Android-9
Voici comment utiliser du code Java. Remarquez comment il convertit un tableau d'octets [] en un tableau de couleurs int [] - cela se brisera si la finalité change, n'est-ce pas? Notez également comment il utilise des tableaux au lieu d'entiers simples pour la largeur et la hauteur afin qu'ils soient passés par référence.
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 est pris en charge pour Android 4.0+ , a.k.a. API de niveau 14. Vous pouvez vérifier en utilisant Android.os.Build.VERSION >= 14
.
Nous avons écrit une bibliothèque Android juste pour cela.
https://github.com/EverythingMe/webp-Android
webp-Android est une bibliothèque que nous utilisons chez EverythingMe depuis que nous aimons webp. Nous l'utilisons pour économiser la bande passante et pour réduire la taille de nos APK.
webp-Android est une adaptation du décodeur webp de chrome, ainsi qu'un ajout d'un wrapper JNI pour l'utiliser facilement dans votre code Java. Il est également facile de charger des images webp de xml dans un ImageView (avec le WebpImageView
inclus ) ainsi:
<me.everything.webp.WebpImageView
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
webp:webp_src="@drawable/your_webp_image" />
Google affirme que WebP est pris en charge à partir d'Android 4.0+ ( http://developer.Android.com/guide/appendix/media-formats.html ), mais dans nos propres tests, les images Webp s'affichent sous forme de points d'interrogation bleus le navigateur standard et Chrome sur Android 4.0 et 4.1. Sur Android 4.2, les images WebP semblent être rendues correctement dans une vue Web et dans Google Chrome.
Il n’existe actuellement aucun moyen d’afficher une image WebP sur une application native sur un appareil Android, y compris le navigateur Web. Vous devrez examiner des applications tierces pour afficher ces images.
Selon la liste de diffusion WebP, ils travaillent sur l’incorporation du support WebP dans le SDK Android. Ils n'ont pas précisé quand exactement ils prévoient de publier cela, mais quand ils le font, vous devriez être capable de sauvegarder des bitmaps au format WebP, ainsi que JPEG et PNG.
EDIT: Android 4.0 alias sandwich à la crème est maintenant livré avec un support natif pour le format WebP. Vous pouvez voir les types de fichiers pris en charge sur le site de développement Android .