Android向けWebPの使用例はありますか?私はwebp画像のリストを取得し、それらをimageviewでリストビューに表示しようとしています。
Libwebp apiがあることを知っており、NDKを使用してAndroidプロジェクトに統合しましたが、apiを使用してバイナリwebpを取得し、imageviewに表示するにはどうすればよいですか?
どんな助けでも素晴らしいです!
WebPは Android 4.0 + でサポートされています)、別名APIレベル14です。Android.os.Build.VERSION.SDK_INT >= 14
を使用して確認できます。
NDKでlibwebpを使用します。 libwebp-0.1.3にはすでにAndroid.mkファイルが付属しています(古く、構文エラーがありますが)。また、_/swig/
_ディレクトリにJNIバインディングが生成されました。
これが私がそれを機能させた方法です:
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.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);
}
_
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" />
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で正常にレンダリングされるようです。
現在、Androidデバイス(Webブラウザを含む))のネイティブアプリにwebp画像を表示する方法はありません。これらの画像を表示するには、サードパーティのアプリを調べる必要があります。
WebPメーリングリストによると、彼らはWebPサポートをAndroid SDKに組み込むことに取り組んでいます。正確にいつこれをリリースする予定かは明言していませんが、いつリリースするかはビットマップを保存できるはずです。 WebP形式、JPEGおよびPNGとして。
編集:Android 4.0別名アイスクリームサンドイッチには、WebP形式のネイティブサポートが付属しています。サポートされているファイルタイプは Android開発者サイト で確認できます。