标签: imagedecoder

是否有可能让新的ImageDecoder类手动返回一个接一个的Bitmaps?

背景

我试图手动(逐帧)查看动画GIF和WEBP文件的位图,这样它不仅可以用于视图,还可以用于其他情况(例如动态壁纸).

问题

仅使用ImageDecoder API(此处为示例)从Android P支持动画GIF/WEBP文件.

对于GIF,我想尝试滑翔的任务,但我失败了,所以我试图克服这一,通过使用一个库,允许(加载它们在这里,解决方案在这里).我认为它运作正常.

对于WebP,我以为我找到了另一个可以在较旧的Android版本上运行的库(这里,在这里制作了fork ),但似乎在某些情况下它无法很好地处理WebP文件(在此报道).我试图弄清楚问题是什么以及如何解决,但我没有成功.

因此,假设有一天谷歌将通过支持库支持旧版Android的GIF和WEBP动画(他们在这里),我决定尝试使用ImageDecoder来完成任务.

事实上,在ImageDecoder的整个API中,我们应该如何使用它.我不知道如何克服其局限性.

我发现了什么

这就是ImageDecoder如何用于在ImageView上显示动画WebP(当然,这里只有一个示例):

class MainActivity : AppCompatActivity() {
    @SuppressLint("StaticFieldLeak")

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val source = ImageDecoder.createSource(resources, R.raw.test)
        object : AsyncTask<Void, Void, Drawable?>() {
            override fun doInBackground(vararg params: Void?): Drawable? {
                return try {
                    ImageDecoder.decodeDrawable(source)
                } catch (e: Exception) {
                    null
                }
            }

            override fun onPostExecute(result: Drawable?) {
                super.onPostExecute(result) …
Run Code Online (Sandbox Code Playgroud)

android animated-gif imagedecoder animated-webp

17
推荐指数
1
解决办法
1325
查看次数

使用Android P的ImageDecoder有什么用处和优点?

背景

Android P使用ImageDecoder类提供了一个用于加载图像的新API .

问题

并非被记录关于这个类,所以我只是好奇它的用法,我是否应该考虑尽可能使用它,而不是滑行库,例如,其中谷歌本身建议使用:

对于大多数情况,我们建议您使用Glide库来获取,解码和显示应用中的位图.Glide在处理与在Android上使用位图和其他图像相关的这些和其他任务时,大部分复杂性都是抽象的.有关使用和下载Glide的信息,请访问GitHub上的Glide存储库.

我发现了什么

我发现了一些关于它的文章,提供了它可以做什么以及如何使用它的线索:

但是,根据我的测试,与Movie类相比,加载GIF动画更糟糕的是使用此API(占用更多内存,使用大约相同的CPU),而Movie类本身比第三方库(如android-gif-drawable)更糟糕.我测试的是一个相当长的GIF动画.在第三方库上花了大约59MB.使用Movie类需要大约168MB,使用新的ImageDecoder API需要200-300MB ...

简而言之,我发现这个API的原因是:

  1. 它应该取代BitmapFactory
  2. 它支持加载动画GIF/WEBP
  3. 它有一些用于前/后处理的监听器
  4. 它应该更高效,但我没有看到它,至少在内存使用方面没有.

问题

  1. 使用此API有什么优势,而不是我们在第三方库中已有的优势?含义为静态图像滑动,为GIF设置"android-gif-drawable"(对于我没有搜索的WEBP,可能是什么东西)?

  2. 它是否在幕后表现更好,我不应该关心它的内存使用情况?

  3. 它有内存/磁盘缓存吗?如果是这样,那么它如何管理其内存缓存,因为Android不会在堆内存中存储Bitmaps(在此处写到)?

  4. 该API是否可以在支持库中使用?否则我根本不需要使用它...编辑:似乎它可能在支持库上.链接在这里.

android animated-gif android-bitmap imagedecoder android-9.0-pie

10
推荐指数
0
解决办法
1539
查看次数

如何使用 Android 的 ImageDecoder 类获取图像大小?

尝试使用ImageDecoder获取图像大小时,我找不到任何仅获取大小而不解码图像位图的选项。

使用BitmapFactory可以完成:

BitmapFactory.Options.inJustDecodeBounds = true
Run Code Online (Sandbox Code Playgroud)

此设置使解码器仅获取图像大小而无需解码并返回位图。但是ImageDecoder没有等效的选项。

另外,大小好像只有在 ImageDecoder. OnHeaderDecodedListener被调用,此时没有任何选项可以取消解码并避免返回位图。

size android bitmapfactory imagedecoder

5
推荐指数
0
解决办法
80
查看次数