【问题标题】:Read and show WebP images读取和显示 WebP 图像
【发布时间】:2012-07-18 02:23:25
【问题描述】:

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

即使在旧设备上也能最小化应用图像的大小。

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

【问题讨论】:

    标签: android jar bitmap webp


    【解决方案1】:

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

    • 下载webp库,当前版本here
    • 在您的 Android“jni”文件夹中创建,将 libwep 内容复制到其中
    • 在 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 图像文件放入 res/drawable 文件夹而不是 assets 文件夹吗?
    • 是的,你可以,像这样:Drawable drawable = getResources().getDrawable(R.drawable.image); BitmapDrawable bD = (BitmapDrawable) 可绘制;位图 bitmap = bD.getBitmap();, byte[] 编码 = stream.toByteArray();等等……
    • 哎呀,考虑得不够多。对不起。无论如何,我不确定如何处理其他图像,但在这里它要求将整个文件加载到字节数组中进行解码。它是否正确?其他文件格式也一样吗?
    【解决方案2】:

    如果您的 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();
            }
    

    【讨论】:

    • 这个问题很老了,在没有支持之前询问处理WEBP文件。
    猜你喜欢
    • 1970-01-01
    • 2014-09-30
    • 2023-02-17
    • 2021-05-29
    • 2020-04-24
    • 1970-01-01
    • 2013-10-26
    • 2020-05-06
    • 1970-01-01
    相关资源
    最近更新 更多