24

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

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

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

4

5 に答える 5

28

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

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

  1. NDK をダウンロードし、 system に配置します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.soWebPDecodeRGBリストには、ネイティブ ライブラリ関数 ( など) と対応する JNI関数 ( などJava_com_google_webp_libwebpJNI_WebPDecodeRGB)の両方が表示されます。
  7. /jni/swig/libwebp.jarAndroid プロジェクトのビルド パスに追加
  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のコンテンツはこちらです。エンコーダ ビットが削除されている点を除いて、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);

}
于 2011-12-07T21:19:21.153 に答える
16

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

于 2011-11-21T23:20:58.023 に答える
5

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

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

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

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

<me.everything.webp.WebpImageView
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  webp:webp_src="@drawable/your_webp_image" />
于 2015-09-17T12:11:01.863 に答える
4

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

于 2013-03-04T14:37:38.610 に答える
0

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

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

編集: Android 4.0 別名 Ice Cream Sandwich には、WebP 形式のネイティブ サポートが付属しています。サポートされているファイルの種類は、Android デベロッパー サイトで確認できます。

于 2011-10-03T17:19:34.033 に答える