问题标签 [imagedecoder]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
2223 浏览

android - 使用Android P的ImageDecoder有什么用处和优势?

背景

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

问题

关于这个类的文档不多,所以我只是好奇它的用法,以及我是否应该在可能的情况下考虑使用它,而不是Glide 库,例如,谷歌本身建议使用它:

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

我发现了什么

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

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

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

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

问题

  1. 与我们在第三方库中已有的相比,使用此 API 有什么优势吗?意思是 Glide 用于静态图像,“android-gif-drawable”用于 GIF(也许是我没有搜索的 WEBP 的东西)?

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

  3. 它有内存/磁盘缓存吗?如果是这样,既然 Android 不在堆内存中存储位图,它如何管理其内存缓存(在此处写到)?

  4. 支持库中是否有可能提供此 API?否则我认为根本不需要使用它......编辑:似乎它可能在支持库中。链接在这里

0 投票
2 回答
2180 浏览

android - ImageDecoder 与 BitmapFactory

使用 android Pie 可以使用一个新类来处理位图和可绘制操作。以前我在大多数应用程序中使用 BitmapFactory 来处理位图操作。

我的问题是

我应该开始使用 ImageDecoder 吗? ImageDecoder 比 BitmapFactory 好多少?

它是给定的

“ImageDecoder 类,它提供了一种现代化的图像解码方法”

但是官方文档对此并没有多说

如果有人使用过这个类,可以解释使用这个 ImageDecoder 类有什么好处?

是我找到它的官方文档

0 投票
4 回答
4885 浏览

android - 是否可以手动让新的 ImageDecoder 类一帧一帧地返回位图?

背景

我正在尝试手动(逐帧)检查动画 GIF 和 WEBP 文件的位图,以便它不仅适用于视图,而且适用于其他情况(例如动态壁纸)。

问题

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

对于 GIF,我想尝试 Glide 来完成这项任务,但我失败了,所以我尝试通过使用允许加载它们的库来克服这个问题(这里,解决方案这里)。我认为它工作正常。

对于 WebP,我想我找到了另一个可以在旧 Android 版本上运行的库(在这里,在这里做了 fork ),但它似乎在某些情况下不能很好地处理 WebP 文件(在这里报告)。我试图找出问题所在以及如何解决它,但我没有成功。

所以,假设有一天谷歌会通过支持库(他们写在这里)支持旧 Android 版本的 GIF 和 WEBP 动画,我决定尝试使用 ImageDecoder 来完成这项任务。

问题是,查看 ImageDecoder 的整个 API,我们应该如何使用它是非常有限的。我不知道如何克服它的限制。

我发现了什么

这就是 ImageDecoder 可用于在 ImageView 上显示动画 WebP 的方式(当然,这里只是一个示例):

我试图阅读ImageDecoderAnimatedImageDrawable的所有文档,并查看它的代码,但我不明白如何手动检查每一帧,并有时间在它们之间等待。

问题

  1. 有没有办法使用 ImageDecoder API 手动检查每一帧,获取要绘制的位图并知道在帧之间需要等待多长时间?有什么可用的解决方法吗?也许甚至使用 AnimatedImageDrawable ?

  2. 我想在旧的 Android 版本上做同样的事情。可能吗?如果有怎么办?也许在不同的 API/库上?谷歌写道,它可以在较旧的 Android 版本上使用 ImageDecoder,但我没有看到任何地方提到它(除了我提供的链接)。可能还没有准备好……Android P 甚至还没有达到 0.1% 的用户……也许Fresco可以做到?我也试过在那里检查它,但我也没有看到它能够做这样的事情,而且它是一个巨大的库,仅用于这项任务,所以我宁愿使用不同的库来代替.. . 我也知道 libwebp 是可用的,但它是 C/C++ 的,不确定它是否适合 Android,以及在 Java/Kotlin for Android 上是否有它的端口。


编辑:

因为我认为我得到了我想要的,对于第三方库和 ImageDecoder,能够从动画 WebP 中获取位图,我仍然想知道如何使用 ImageDecoder 获取帧数和当前帧,如果这是可能的。我尝试使用ImageDecoder.decodeDrawable(source, object : ImageDecoder.OnHeaderDecodedListener...,但它不提供帧计数信息,并且我无法在 API 中看到我可以转到特定的帧索引并从那里开始,或者知道特定帧的时间有多长需要进入下一帧。所以我对这里的那些人做了一个reuqest 。

可悲的是,我也找不到 Google 有适用于旧 Android 版本的 ImageDecoder。

如果有某种方法可以像我对相对较新的 HEIC 动画文件所做的那样做同样的事情,这也很有趣。目前它仅在 Android P 上受支持。

0 投票
0 回答
111 浏览

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

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

使用BitmapFactory可以完成:

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

另外,大小似乎只有在 ImageDecoder 时才知道。OnHeaderDecodedListener被调用,此时也没有任何选项可以取消解码并避免返回位图。

0 投票
1 回答
166 浏览

android - 为什么 Android 的 ImageDecoder(在 Pie 中引入)没有公共 InputStreamSource?

Android 用于解码图像的新类ImageDecoder有很多源类型。但不createSource(InputStream)包括在内。有一个类似的方法createSource(Resources res, InputStream is),但它是隐藏的(为什么?)。

现在我想使用 ImageDecoder 来解码一个,它是从一个就像InputStream打开的一样。ZipFile.getInputStream()BitmapFactory.decodeStream

所以:

  1. 为什么隐藏方法?
  2. 有没有其他选择,所以我可以ImageDecoder使用InputStream?(因为我不想使用旧的BitmapFactory
0 投票
0 回答
130 浏览

c++ - 如何从 H264 原始数据中获取图像

我正在使用 RTSP API 从 AXIS 相机获取数据。我想从接收到的原始数据中提取图像(h264编解码格式)

我正在使用 libturbojpeg 压缩数据和 cximage 来创建图像

  1. 我可以直接将 libturbojpeg 用于 h264 原始数据吗?
  2. 在压缩之前我需要使用其他库吗?
0 投票
1 回答
174 浏览

python - 图像到文本解码器

我想将以下图像解码为文本: 在此处输入图像描述

我已经尝试将Tesseract OCR用于我的目的,但到目前为止我并不幸运。

这是我的代码:

这是我的程序的输出:

看来我的程序无法解码图片。我试图用更“明显”的文本解码图像,它做得很好。我还尝试了其他几个此类验证码的示例,但均未成功。你建议我做什么?

问题是,最后,我想编写一个程序来自动解码这样的图像,所以除非有可靠的方法以使 Tesseract 兼容的方式自动修改图像,否则我看不到任何其他方法解决这个问题。如果有人知道某个图书馆或其他东西......会有所帮助。

0 投票
4 回答
464 浏览

android - 如何使用 ImageDecoder 获取可变位图?

我正在创建位图如下

这将返回不可变位图。我看到了谷歌文档并且有一种方法setMutableRequired(),但我找不到如何使用这种方法。它不适用于 ImageDecoder 以及源

0 投票
1 回答
549 浏览

java - 从 URI 加载带有 ImageDecoder 的位图并添加文本

在我的活动中,我想修改图像以在其上添加文本。

在画廊中选择图像或使用相机拍摄图像,然后将其存储在先前活动中的文件中。然后该文件的 uri 通过 extras 传递。

现在我尝试在图像顶部添加一个字符串,如下所示:

这是函数的主体:

预期的行为是在其顶部显示带有“Some Text here”的图像。但是没有显示任何内容,但是应用程序不会崩溃。

在调试时,我遇到了一个出现在

位图位图 = ImageDecoder.decodeBitmap(source);

画布画布=新画布(位图);

这是错误:

java.io.FileNotFoundException:没有内容提供者:/storage/emulated/0/Android/data/com.emergence.pantherapp/files/Pictures/JPEG_20200829_181926_7510981182141824841.jpg

我怀疑我误用了“ImageDecoder”,因为这是我第一次使用它。更准确地说,我无法让onCreate中的“decodeBitmap”方法,Android Studio告诉我它不能在“主线程”中,我对线程一点也不熟悉。将它移动到专用函数中解决了这个问题,但也许我应该做其他事情,这是问题的根源。

我的问题: 我是否使用正确的工具来修改文件并在其上添加文本?如果是,我做错了什么?如果没有,我应该研究什么库/工具来完成这项任务?

谢谢,

编辑:附加答案元素

正如@blackapps 和@rmunge 都指出的那样,我得到的不是合法的URI,而是文件路径。解决我的问题的简单方法是使用以下代码从路径中获取 URI:

另外要编辑位图,它必须是可变的,例如这里介绍的。

从 URI 中提取位图并在其上添加文本的最后一个函数是:

0 投票
1 回答
981 浏览

reactjs - React Js 从 AWS s3 URL 获取图像

我有 7 个 URL,其中有时 3-4 个是有效的可下载图像。所以在使用 getPhotosList 函数渲染图像之前,使用函数CheckValidImages检查有效下载 URL

在 CheckValidImage 函数中,getRecipeDetailWorkflowRead.recipePhotos[i].path有一个图像路径,我检查它是否有效。现在,如果图像有效,我尝试将其推送到 recipePhotos 中,最后在检查完所有图像路径后,我更新状态 setRecipeDetailWorkflowRead

但是,如果图像尺寸较大,这似乎很耗时。有人可以建议我可以更快地检索图像的其他替代选项。