web-dev-qa-db-fra.com

WebP pour Android

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!

20
Faisal Abid

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:

  1. Téléchargez NDK, mettez-le dans le système PATH.
  2. téléchargez libwebp-0.1.3.tar.gz, placez-le dans your_project_dir/jni
  3. Remplacez Android.mk par celui ci-dessous. 
  4. Créez jni/src/libwebp_Java_wrap.c avec le contenu ci-dessous.
  5. créer jni/Application.mk, avec le contenu ci-dessous.
  6. lancez 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).
  7. Ajoutez /jni/swig/libwebp.jar pour construire le chemin de votre projet Android
  8. Voir ci-dessous par exemple comment l'utiliser en code Java

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

}
26
Pēteris Caune

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.

15
beetstra

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" />
5
Rotemmiz

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.

3

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 .

0
TrevorBliss