web-dev-qa-db-ja.com

AndroidのWebP

Android向けWebPの使用例はありますか?私はwebp画像のリストを取得し、それらをimageviewでリストビューに表示しようとしています。

Libwebp apiがあることを知っており、NDKを使用してAndroidプロジェクトに統合しましたが、apiを使用してバイナリwebpを取得し、imageviewに表示するにはどうすればよいですか?

どんな助けでも素晴らしいです!

23
Faisal Abid

WebPは Android 4.0 + でサポートされています)、別名APIレベル14です。Android.os.Build.VERSION.SDK_INT >= 14を使用して確認できます。

16
beetstra

NDKでlibwebpを使用します。 libwebp-0.1.3にはすでにAndroid.mkファイルが付属しています(古く、構文エラーがありますが)。また、_/swig/_ディレクトリにJNIバインディングが生成されました。

これが私がそれを機能させた方法です:

  1. NDKをダウンロードし、システムPATHに配置します。
  2. libwebp-0.1.3.tar.gzをダウンロードし、それを_your_project_dir/jni_に配置します
  3. _Android.mk_を以下のものに置き換えます。
  4. 以下の内容で_jni/src/libwebp_Java_wrap.c_を作成します。
  5. 以下の内容で_jni/Application.mk_を作成します。
  6. プロジェクトディレクトリから_ndk-build_を実行します。これにより、_.so_に_/libs/_ファイルが生成されます。 _nm -D libs/armeabi/libwebp.so_で検査できます。リストには、ネイティブライブラリ関数(WebPDecodeRGBなど)とそれらに対応するJNI(_Java_com_google_webp_libwebpJNI_WebPDecodeRGB_など)の両方が表示されます。
  7. Androidプロジェクトのビルドパスに_/jni/swig/libwebp.jar_を追加します
  8. Javaコードでの使用例については、以下を参照してください

これがAndroid.mkのコンテンツです。オリジナルから変更:不要なエンコーダビットを削除、_libwebp_Java_wrap.c_を追加、include $(BUILD_STATIC_LIBRARY)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のコンテンツは here であり、エンコーダービットが削除されていることを除いて、libwebp tarballにバンドルされているものと基本的に同じです。

Application.mkのコンテンツ:

_# The ARMv7 is significanly faster due to the use of the hardware FPU
APP_ABI := armeabi armeabi-v7a
APP_PLATFORM := Android-9
_

Javaコードでの使用方法は次のとおりです。 byte []配列をint []カラー配列に変換する方法に注意してください。これは、エンディアンが変更されると壊れますよね?また、幅と高さに単一の整数の代わりに配列を使用して、参照によって渡される方法にも注意してください。

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

}
_
28
Pēteris Caune

Androidそのためだけのライブラリを作成しました。

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

webp-Androidは、webpが大好きなので、EverythingMeで使用するライブラリです。これを使用して、帯域幅を節約し、APKサイズを縮小します。

webp-Androidは、chromiumのwebpデコーダーを適応させたもので、JNIラッパーを追加して、それをJavaコードで簡単に使用できます。また、xmlからImageViewにwebp画像をロードするのも簡単です(含まれているWebpImageView)のように:

<me.everything.webp.WebpImageView
  Android:layout_width="wrap_content"
  Android:layout_height="wrap_content"
  webp:webp_src="@drawable/your_webp_image" />
5
Rotemmiz

Googleは、WebPはAndroid 4.0+( http://developer.Android.com/guide/appendix/media-formats.html )以降でサポートされていると主張していますが、私たち自身ではテストwebp画像は、標準ブラウザとChrome 4.0および4.1のAndroidの両方で青い疑問符として表示されます。 Android 4.2では、WebP画像はWebビューとGoogle Chromeで正常にレンダリングされるようです。

4

現在、Androidデバイス(Webブラウザを含む))のネイティブアプリにwebp画像を表示する方法はありません。これらの画像を表示するには、サードパーティのアプリを調べる必要があります。

WebPメーリングリストによると、彼らはWebPサポートをAndroid SDKに組み込むことに取り組んでいます。正確にいつこれをリリースする予定かは明言していませんが、いつリリースするかはビットマップを保存できるはずです。 WebP形式、JPEGおよびPNGとして。

編集:Android 4.0別名アイスクリームサンドイッチには、WebP形式のネイティブサポートが付属しています。サポートされているファイルタイプは Android開発者サイト で確認できます。

0
TrevorBliss