如何从 Uri 获取位图?
如何从 Uri 获取 Bitmap 对象(如果我成功将其存储在 /data/data/MYFOLDER/myimage.png
或 file///data/data/MYFOLDER/myimage.png
) 在我的应用程序中使用它?
有谁知道如何实现这一目标?
How to get a Bitmap object from an Uri (if I succeed to store it in/data/data/MYFOLDER/myimage.png
or file///data/data/MYFOLDER/myimage.png
) to use it in my application?
Does anyone have an idea on how to accomplish this?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(24)
(科特林)
因此,截至 2020 年 4 月 7 日,上述选项均不起作用,但以下是对我有用的选项:
如果您想将位图存储在 val 中并用它设置 imageView,请使用此:
val bitmap = BitmapFactory.decodeFile(currentPhotoPath).also { 位图 -> imageView.setImageBitmap(bitmap) }
如果您只想将位图设置为 imageView,请使用:
BitmapFactory.decodeFile(currentPhotoPath).also { 位图 -> imageView.setImageBitmap(bitmap) }
(KOTLIN)
So, as of April 7th, 2020 none of the above mentioned options worked, but here's what worked for me:
If you want to store the bitmap in a val and set an imageView with it, use this:
val bitmap = BitmapFactory.decodeFile(currentPhotoPath).also { bitmap -> imageView.setImageBitmap(bitmap) }
If you just want to set the bitmap to and imageView, use this:
BitmapFactory.decodeFile(currentPhotoPath).also { bitmap -> imageView.setImageBitmap(bitmap) }
从移动图库获取图像 uri 的完整方法。
Full method to get image uri from mobile gallery.
我使用此处提供的解决方案时遇到的一个反复出现的问题是:
这将阻止加载您的位图。
我尝试了这个,它有效!赞美神。
解释是提供的uri需要转换成文件路径。
A recurring problem that I faced using the solutions provided here is:
This will prevent your bitmap from being loaded.
I tried this instead and it works! Praise God.
The explanation is that the uri provided needs to be converted into a file path.
在 2022 年,为此目的使用线圈库。
https://coil-kt.github.io/线圈/组合/
用于喷气背包组合
Use coil libray for this purpose on 2022.
https://coil-kt.github.io/coil/compose/
for jetpack compose
这是正确的方法:
如果您需要加载非常大的图像,以下代码会将其加载到图块中(避免大量内存分配):
请参阅答案 这里
Here's the correct way of doing it:
If you need to load very large images, the following code will load it in in tiles (avoiding large memory allocations):
See the answer here
这是正确的方法,同时还要密切关注内存使用情况:
Mark Ingram 帖子中的 getBitmap() 调用也会调用decodeStream(),因此您不会丢失任何功能。
参考文献:
Android :给定原始图像的Uri,获取SD卡上图像的缩略图
处理大位图
Here's the correct way of doing it, keeping tabs on memory usage as well:
The getBitmap() call from Mark Ingram's post also calls the decodeStream(), so you don't lose any functionality.
References:
Android: Get thumbnail of image on SD card, given Uri of original image
Handling large Bitmaps
似乎
MediaStore.Images.Media.getBitmap
在API 29
中已弃用。推荐的方式是使用API 28
中添加的ImageDecoder.createSource
。以下是获取位图的方法:
重要提示:
ImageDecoder.decodeBitmap
读取 EXIF 方向,Media.getBitmap
不会It seems that
MediaStore.Images.Media.getBitmap
was deprecated inAPI 29
. The recommended way is to useImageDecoder.createSource
which was added inAPI 28
.Here's how getting the bitmap would be done:
IMPORTANT:
ImageDecoder.decodeBitmap
read EXIF orientation,Media.getBitmap
doesn't是的,路径必须采用这样的格式
file:///mnt/sdcard/filename.jpg
and yes path must be in a format of like this
file:///mnt/sdcard/filename.jpg
这是最简单的解决方案:
This is the easiest solution:
您可以像这样从 uri 检索位图
You can retrieve bitmap from uri like this
通过使用 glide 库,您可以从
uri
获取位图,几乎在三星设备中图像旋转时,我们必须使用
exifinterface
检查旋转,但使用 glide 不需要检查旋转,图像总是正确接收。
在 kotlin 中,你可以获得位图,因为
我正在使用此依赖项
by using glide library you can get bitmap from
uri
,almost in samsung devices image rotated when and we have to check rotation using
exifinterface
but using glide no need to check rotation, image always correctly received.
in kotlin you can get
bitmap
asI am using this dependency
我没有看到正确的答案,所以我将这个扩展放在
代码中的示例:
I don't see the right answer, so I'll put this extension here
Example in code:
现在已不再使用的
getBitmap
插图我在 Kotlin 中使用以下方法Inset of
getBitmap
which is depricated now I use the following approach in Kotlin使用如下 startActivityForResult 方法
,您可以获得如下结果:
Use startActivityForResult metod like below
And you can get result like this:
我已经尝试了很多方法。这对我来说非常有用。
如果您从图库中选择图片。您需要注意从
intent.clipdata
或intent.data
获取Uri
,因为其中一个在不同版本中可能为 null。I have try a lot of ways. this work for me perfectly.
If you choose pictrue from Gallery. You need to be ware of getting
Uri
fromintent.clipdata
orintent.data
, because one of them may be null in different version.您需要打开输入流
它会在操作完成后自动关闭流。
You need to open inputstream with
as it will automatically close the stream after operation complete.
你可以做这个结构:
通过这个你可以轻松地将 uri 转换为位图。
希望能帮助你。
you can do this structure:
by this you can easily convert a uri to bitmap.
hope help u.