如何从 Uri 获取图像的大小

How to get size of image from Uri

提问人:Davanok 提问时间:11/17/2023 最后编辑:Davanok 更新时间:11/17/2023 访问量:47

问:

我通过以下方式获取图像 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)

如何获取图像的宽度和高度?

安卓 Kotlin android-jetpack-compose

评论

1赞 blackapps 11/17/2023
uri.path 是无稽之谈。使用整个 uri。打开 uri 的 inputstream,并使用 BitmapFactory 对流进行解码。
0赞 blackapps 11/17/2023
I get image Uri by这什么也没告诉我们,因为你没有告诉你你发射了什么。也不要在那里得到 uri。

答:

0赞 Owais Yosuf 11/17/2023 #1

要从 中获取图像的宽度和高度,可以使用 打开 ,然后用于解码尺寸。下面是一个示例:UriContentResolverInputStreamBitmapFactory

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 以供一般使用。