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

How can I get width 和 height of image?

推荐答案

要从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
}

一百零二

Android相关问答推荐

如何清除导航抽屉中以前 Select 的项目(Jetpack Compose)

无法在Android中创建通知频道

Android 14上的慢速意图广播交付

Android:微调:在代码中设置ArrayAdapter不希望调用On ItemSelected,仅当用户单击微调时调用

在带有REACT-Native-CLI的开发和生产中使用Firebase的最佳实践

在Jetpack Compose中从LazyColumn中删除项目时发生IndexOutOf边界异常

如何从sqlite数据库中检索数据到碎片android?

如何从URI中获取图像大小

如何将DrawableId参数传递给XML布局?

Android Studio Relay插件(版本0.3.07)错误

更改当前活动并返回后,Android webview 滚动不起作用

如何让这个三角形指示器在 android jetpack compose 中旋转和移动?

Jetpack Compose 动画的行为是什么?

如何将一个 Composable 作为其参数传递给另一个 Composable 并在 Jetpack Compose 中显示/运行它

为什么项目捕获对象给我在 Compose 中找不到参考

Jetpack Compose Arc 进度条动画(如何重启动画)

将房间中的实体更新为 isCompleted 并使用 Flow 问题获取所有数据

Kotlin Coroutines Dispatchers.IO 没有创建预期的线程

在 jetpack compose 中使用 viewmodel 的最佳实践

如何使 BasicTextField 上的光标以 jetpack compose 为中心?