0

我知道这个问题已经在某些地方(比如这里)提到过,但是有没有一种简单的方法来读取 WebP 图像,比如使用 jar 文件?

即使在旧设备上最小化应用程序的图像大小也会很棒。

是否可以像使用其他格式一样将 WebP inputStream 读取到普通位图实例,即使在较旧的 android 版本(比 ICS 旧)上也是如此?

4

2 回答 2

1

您提供的示例非常好,总结一下,您需要遵循以下步骤:

  • 在此处下载 webp 库,当前版本
  • 在您的 Android “jni” 文件夹中创建,将 libwep 内容复制到其中
  • 在 jni/Android.mk 添加:

    痛饮/libwebp_java_wrap.c \

    toLOCAL_SRC_FILES := \ 和 remove include $(BUILD_STATIC_LIBRARY), put 代替include $(BUILD_SHARED_LIBRARY)

  • 转到您的项目目录并运行

    ./path-to-android-ndk/ndk-build

  • 如果您不知道如何使用 ndk,请尝试这里

  • 如果编译成功,您将获得 libwebp.jar,将其包含在您的项目构建路径中

  • 在您的活动中,您首先提出:

    静态 { System.loadLibrary("webp"); }

  • 然后您可以通过 InputStream 读取 .webp 文件(即从 assets 文件夹中):

    InputStream is = getAssets().open("image.webp");

  • 从这里下载 apache 库,将其包含在您的项目构建路径中

  • 然后您可以将 InputStream 读取到字节数组:

    byte[] 编码 = IOUtils.toByteArray(is);

  • 通过 libwebp 解码文件:

    整数 [] 宽度 = 新整数 [] { 0 };

    整数 [] 高度 = 新整数 [] { 0 };

    byte[] decoded = libwebp.WebPDecodeARGB(encoded, encoded.length, width, height);

  • 转换为位图:

    int[] 像素 = 新 int[decoded.length / 4];

    ByteBuffer.wrap(decoded).asIntBuffer().get(pixels);

    位图bitamp = Bitmap.createBitmap(像素,宽度[0],高度[0],Bitmap.Config.ARGB_8888);

  • 最后几行在这里形成

  • 随心所欲地处理您的位图。

于 2013-06-10T07:24:16.963 回答
1

如果您的 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();
        }
于 2020-09-07T03:56:55.760 回答