kotlin 如何从Uri中获取图像的大小

sqserrrh  于 2023-11-21  发布在  Kotlin
关注(0)|答案(2)|浏览(287)

我得到图像乌里

val launcher = rememberLauncherForActivityResult(ActivityResultContracts.PickVisualMedia()){uri = it}

launcher.launch(PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageOnly))

字符串
我需要得到这个图像的大小

val painter = rememberAsyncImagePainter(uri)
return painter.intrinsicSize


但返回Unspecified size

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)
如何获取图像的宽度和高度?

5us2dqdw

5us2dqdw1#

要从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操作,因此请确保您的项目设置为使用协程。*
x8goxv8g

x8goxv8g2#

它的发生与

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)
    }
}

字符串

相关问题