问题标签 [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.
android - 使用Android P的ImageDecoder有什么用处和优势?
背景
Android P 提供了一个用于加载图像的新 API,使用ImageDecoder类。
问题
关于这个类的文档不多,所以我只是好奇它的用法,以及我是否应该在可能的情况下考虑使用它,而不是Glide 库,例如,谷歌本身建议使用它:
在大多数情况下,我们建议您使用 Glide 库在您的应用程序中获取、解码和显示位图。Glide 抽象出处理这些和其他与在 Android 上使用位图和其他图像相关的任务的大部分复杂性。有关使用和下载 Glide 的信息,请访问 GitHub 上的 Glide 存储库。
我发现了什么
我找到了一些关于它的文章,提供了它可以做什么以及如何使用它的线索:
- https://blog.stylingandroid.com/imagedecoder-error-handling-cropping-scaling/
- https://vivekc.xyz/whats-new-in-android-p-the-break-changes-and-amazing-features-8f4e864802a9 - 表示与 BitmapFactory 不同,它还可以处理“动画 GIF 和 WebP 图像” , 创建AnimatedImageDrawable
- https://www.androidpolice.com/2018/03/07/google-announces-android-p-notch-support-multi-camera-api-indoor-positioning/ - 说它的解码效果更好。不知道哪种方式更好...
- https://youtu.be/LBBqTd6uOd4?t=116 - 表示你可以做一些类似于 Glide 的操作:裁剪、拥有监听器等...
- https://developer.android.com/preview/features?authuser=1#decoding-images
- https://blog.stylingandroid.com/imagedecoder-error-handling-cropping-scaling/
但是,根据我的测试,与 Movie 类相比,使用此 API 加载 GIF 动画更糟糕(占用更多内存,使用大约相同的 CPU),后者本身比android-gif-drawable等第三方库更差。我测试的是一个相当长的GIF动画。在第三方库上大约需要 59MB。使用 Movie 类大约需要 168MB,使用新的 ImageDecoder API 大约需要 200-300MB ...
简而言之,我对这个 API 的发现是:
- 它应该取代 BitmapFactory
- 它支持加载动画GIF/WEBP
- 它有一些用于前/后处理的侦听器
- 它应该更有效,但我看不到它,至少在内存使用方面没有。
问题
android - ImageDecoder 与 BitmapFactory
使用 android Pie 可以使用一个新类来处理位图和可绘制操作。以前我在大多数应用程序中使用 BitmapFactory 来处理位图操作。
我的问题是
我应该开始使用 ImageDecoder 吗? ImageDecoder 比 BitmapFactory 好多少?
它是给定的
“ImageDecoder 类,它提供了一种现代化的图像解码方法”
但是官方文档对此并没有多说
如果有人使用过这个类,可以解释使用这个 ImageDecoder 类有什么好处?
这是我找到它的官方文档
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 的方式(当然,这里只是一个示例):
我试图阅读ImageDecoder和AnimatedImageDrawable的所有文档,并查看它的代码,但我不明白如何手动检查每一帧,并有时间在它们之间等待。
问题
有没有办法使用 ImageDecoder API 手动检查每一帧,获取要绘制的位图并知道在帧之间需要等待多长时间?有什么可用的解决方法吗?也许甚至使用 AnimatedImageDrawable ?
我想在旧的 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 上受支持。
android - 如何使用 Android 的 ImageDecoder 类获取图像大小?
尝试使用ImageDecoder获取图像大小我找不到任何选项来仅获取大小而不解码图像位图。
使用BitmapFactory可以完成:
此设置使解码器仅获取图像大小而无需解码并返回位图。但是ImageDecoder没有等效的选项。
另外,大小似乎只有在 ImageDecoder 时才知道。OnHeaderDecodedListener被调用,此时也没有任何选项可以取消解码并避免返回位图。
android - 为什么 Android 的 ImageDecoder(在 Pie 中引入)没有公共 InputStreamSource?
Android 用于解码图像的新类ImageDecoder有很多源类型。但不createSource(InputStream)
包括在内。有一个类似的方法createSource(Resources res, InputStream is)
,但它是隐藏的(为什么?)。
现在我想使用 ImageDecoder 来解码一个,它是从一个就像InputStream
打开的一样。ZipFile.getInputStream()
BitmapFactory.decodeStream
所以:
- 为什么隐藏方法?
- 有没有其他选择,所以我可以
ImageDecoder
使用InputStream
?(因为我不想使用旧的BitmapFactory
)
c++ - 如何从 H264 原始数据中获取图像
我正在使用 RTSP API 从 AXIS 相机获取数据。我想从接收到的原始数据中提取图像(h264编解码格式)
我正在使用 libturbojpeg 压缩数据和 cximage 来创建图像
- 我可以直接将 libturbojpeg 用于 h264 原始数据吗?
- 在压缩之前我需要使用其他库吗?
android - 如何使用 ImageDecoder 获取可变位图?
我正在创建位图如下
这将返回不可变位图。我看到了谷歌文档并且有一种方法setMutableRequired()
,但我找不到如何使用这种方法。它不适用于 ImageDecoder 以及源
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 中提取位图并在其上添加文本的最后一个函数是:
reactjs - React Js 从 AWS s3 URL 获取图像
我有 7 个 URL,其中有时 3-4 个是有效的可下载图像。所以在使用 getPhotosList 函数渲染图像之前,我使用函数CheckValidImages检查有效下载 URL
在 CheckValidImage 函数中,getRecipeDetailWorkflowRead.recipePhotos[i].path有一个图像路径,我检查它是否有效。现在,如果图像有效,我尝试将其推送到 recipePhotos 中,最后在检查完所有图像路径后,我更新状态 setRecipeDetailWorkflowRead
但是,如果图像尺寸较大,这似乎很耗时。有人可以建议我可以更快地检索图像的其他替代选项。