提问人:Davanok 提问时间:11/17/2023 最后编辑:Davanok 更新时间:11/17/2023 访问量:47
如何从 Uri 获取图像的大小
How to get size of image from Uri
问:
我通过以下方式获取图像 Uri
val launcher = rememberLauncherForActivityResult(ActivityResultContracts.PickVisualMedia()){uri = it}
launcher.launch(PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageOnly))
我需要获取此图像的大小 我试着用
val painter = rememberAsyncImagePainter(uri)
return painter.intrinsicSize
但这返回未指定的大小
和
val options = BitmapFactory.Options()
options.inJustDecodeBounds = true
BitmapFactory.decodeFile(uri.path, options)
Log.d("MyLog", "${options.outWidth}, ${options.outHeight}")
return IntSize(options.outWidth, options.outHeight)
但它返回 IntSize(0, 0)
如何获取图像的宽度和高度?
答:
0赞
Owais Yosuf
11/17/2023
#1
要从 中获取图像的宽度和高度,可以使用 打开 ,然后用于解码尺寸。下面是一个示例:Uri
ContentResolver
InputStream
BitmapFactory
import android.content.ContentResolver
import android.graphics.BitmapFactory
import android.net.Uri
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import java.io.IOException
suspend fun getImageSize(contentResolver: ContentResolver, uri: Uri): Pair<Int, Int>? {
return withContext(Dispatchers.IO) {
var inputStream = try {
contentResolver.openInputStream(uri)
} catch (e: IOException) {
null
}
var options: BitmapFactory.Options? = null
var result: Pair<Int, Int>? = null
try {
options = BitmapFactory.Options()
options.inJustDecodeBounds = true
BitmapFactory.decodeStream(inputStream, null, options)
result = Pair(options.outWidth, options.outHeight)
} finally {
inputStream?.close()
}
result
}
}
然后,您可以像这样使用此函数:
val size = getImageSize(contentResolver, uri)
if (size != null) {
val width = size.first
val height = size.second
// Do something with width and height
} else {
// Handle the case where the size couldn't be determined
}
注意:contentResolver
通常是从上下文中获取的。确保您具有从给定 URI
读取数据所需的权限。此外,此函数使用协程在后台执行 I/O 操作,因此请确保将项目设置为使用协程。
0赞
Davanok
11/17/2023
#2
它发生在
fun Uri.imageSize(context: Context): IntSize{
val options = BitmapFactory.Options()
options.inJustDecodeBounds = true
context.contentResolver.openInputStream(this).use {
BitmapFactory.decodeStream(it, null, options)
return IntSize(options.outWidth, options.outHeight)
}
}
评论
0赞
Smit Bhanvadia
11/17/2023
由于上述解决方案返回 IntSize,因此可以将上述解决方案用于 Jetpack Compose,也可以将返回类型更改为 Map 以供一般使用。
上一个:如何在颤振中连接和检测智能手表
下一个:Android中的手势是什么
评论
I get image Uri by
这什么也没告诉我们,因为你没有告诉你你发射了什么。也不要在那里得到 uri。