【发布时间】:2012-07-18 02:23:25
【问题描述】:
我知道这个问题已经在某些地方(例如here)提到过,但是有没有一种简单的方法可以读取 WebP 图像,例如使用 jar 文件?
即使在旧设备上也能最小化应用图像的大小。
是否可以像使用其他格式一样将 WebP inputStream 读取到普通位图实例,即使在较旧的 android 版本(比 ICS 更早)上也是如此?
【问题讨论】:
我知道这个问题已经在某些地方(例如here)提到过,但是有没有一种简单的方法可以读取 WebP 图像,例如使用 jar 文件?
即使在旧设备上也能最小化应用图像的大小。
是否可以像使用其他格式一样将 WebP inputStream 读取到普通位图实例,即使在较旧的 android 版本(比 ICS 更早)上也是如此?
【问题讨论】:
您提供的示例非常好,总结一下您需要遵循以下步骤:
在 jni/Android.mk 中添加:
swig/libwebp_java_wrap.c \
到LOCAL_SRC_FILES := \
并删除include $(BUILD_STATIC_LIBRARY),改为include $(BUILD_SHARED_LIBRARY)
进入你的项目目录并运行
./path-to-android-ndk/ndk-build
如果你不知道如何使用ndk,试试here
如果你编译成功,你会得到libwebp.jar,将它包含在你的项目构建路径中
在你的活动中,你先放:
静态{ System.loadLibrary("webp"); }
然后您可以通过 InputStream 读取 .webp 文件(即从 assets 文件夹中):
InputStream is = getAssets().open("image.webp");
从 here 下载 apache 库,将其包含在您的项目构建路径中
然后你可以将 InputStream 读入字节数组:
byte[] 编码 = IOUtils.toByteArray(is);
通过 libwebp 解码文件:
int[] 宽度 = 新的 int[] { 0 };
int[] 高度 = 新的 int[] { 0 };
byte[] 解码 = libwebp.WebPDecodeARGB(encoded, encoded.length, width, height);
转换为位图:
int[] 像素 = 新的 int[decoded.length / 4];
ByteBuffer.wrap(decoded).asIntBuffer().get(pixels);
Bitmap bitamp = Bitmap.createBitmap(pixels, width[0], height[0], Bitmap.Config.ARGB_8888);
最后几行取自here
随心所欲地使用位图。
【讨论】:
如果您的 webp 图像存储在 assets 文件夹中,则使用此代码读取并在 imageView 中显示
try {
InputStream inputStream = context.getAssets().open("yourfilename.webp");
BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
Bitmap bmp = BitmapFactory.decodeStream(bufferedInputStream);
imageView.setImageBitmap(bmp);
} catch (IOException e) {
e.printStackTrace();
}
【讨论】: