Android で WebP を使用する方法の例はありますか? 私はwebp画像のリストを取得し、それらを画像ビューでリストビューに表示しようとしています。
libwebp api があることは知っており、NDK を使用して Android プロジェクトに統合しましたが、API を使用してバイナリ webp を取得し、それをイメージビューに表示するにはどうすればよいですか?
どんな助けでも素晴らしいでしょう!
Android で WebP を使用する方法の例はありますか? 私はwebp画像のリストを取得し、それらを画像ビューでリストビューに表示しようとしています。
libwebp api があることは知っており、NDK を使用して Android プロジェクトに統合しましたが、API を使用してバイナリ webp を取得し、それをイメージビューに表示するにはどうすればよいですか?
どんな助けでも素晴らしいでしょう!
NDK で libwebp を使用します。libwebp-0.1.3 にはすでに Android.mk ファイルが付属しています (古くて構文エラーがありますが、まだ)。また、ディレクトリに生成された JNI バインディングも取得します/swig/
。
これが私がそれを機能させた方法です:
PATH
。your_project_dir/jni
Android.mk
ます。jni/src/libwebp_java_wrap.c
以下の内容で作成してください。jni/Application.mk
します。ndk-build
プロジェクト ディレクトリから実行します。.so
これにより、にファイルが生成されます/libs/
。で調べることができますnm -D libs/armeabi/libwebp.so
。WebPDecodeRGB
リストには、ネイティブ ライブラリ関数 ( など) と対応する JNI関数 ( などJava_com_google_webp_libwebpJNI_WebPDecodeRGB
)の両方が表示されます。/jni/swig/libwebp.jar
Android プロジェクトのビルド パスに追加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);
}
WebPはAndroid4.0以降、別名APIレベル14でサポートされています。を使用して確認できます
android.os.Build.VERSION.SDK_INT >= 14
。
そのためだけに 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" />
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 で正常にレンダリングされるようです。
現在、Web ブラウザーを含む Android デバイスのネイティブ アプリで Webp 画像を表示する方法はありません。これらの画像を表示するには、サードパーティのアプリを調べる必要があります。
WebP メーリング リストによると、彼らは WebP サポートを Android SDK に組み込むことに取り組んでいます。彼らはこれをリリースする正確な時期については明らかにしていませんが、リリース時にはビットマップを JPEG や PNG と同様に WebP 形式で保存できるはずです。
編集: Android 4.0 別名 Ice Cream Sandwich には、WebP 形式のネイティブ サポートが付属しています。サポートされているファイルの種類は、Android デベロッパー サイトで確認できます。