elect
04/10/2024, 8:05 AMload = { loadImageBitmap(File("sample.png")) },
fails because it cant find the image although I placed it under "commonMain/composeResources/drawable", and build.gradle.kts
does have implementation(compose.components.resources)
where am I wrong?elect
04/10/2024, 8:06 AMPainter
? File
is just for absolute paths, isn't?Alexander Maryanovsky
04/10/2024, 8:25 AMAlexander Maryanovsky
04/10/2024, 8:25 AMelect
04/10/2024, 8:25 AMelect
04/10/2024, 8:26 AMAlexander Maryanovsky
04/10/2024, 8:27 AMelect
04/10/2024, 8:28 AMAsyncImage
?Alexander Maryanovsky
04/10/2024, 8:28 AMelect
04/10/2024, 8:28 AMload
and get directly painter
?elect
04/10/2024, 8:29 AM@Composable
fun <T> AsyncImage(load: suspend () -> T,
painterFor: @Composable (T) -> Painter,
contentDescription: String,
modifier: Modifier = Modifier,
contentScale: ContentScale = ContentScale.Fit) {
val image: T? by produceState<T?>(null) {
value = withContext(<http://Dispatchers.IO|Dispatchers.IO>) {
try {
load()
} catch (e: IOException) {
// instead of printing to console, you can also write this to log,
// or show some error placeholder
e.printStackTrace()
null
}
}
}
if (image != null)
Image(painter = painterFor(image!!),
contentDescription = contentDescription,
contentScale = contentScale,
modifier = modifier)
}
Alexander Maryanovsky
04/10/2024, 8:30 AMelect
04/10/2024, 8:30 AMAlexander Maryanovsky
04/10/2024, 8:31 AMelect
04/10/2024, 8:32 AMIf you’re showing an image from a local resource, there’s no need to async itbut for the sake of knowing how it shall be done?
elect
04/10/2024, 8:32 AMAlexander Maryanovsky
04/10/2024, 8:33 AMelect
04/10/2024, 8:33 AMelect
04/10/2024, 8:33 AMcomposeResources
Alexander Maryanovsky
04/10/2024, 8:36 AMelect
04/10/2024, 8:48 AMByteArray
to Painter
?Alexander Maryanovsky
04/10/2024, 8:49 AMAlexander Maryanovsky
04/10/2024, 8:50 AMelect
04/10/2024, 8:50 AMImage.makeFromEncoded(inputStream.readAllBytes()).toComposeImageBitmap()
elect
04/10/2024, 9:10 AMfun main() = singleWindowApplication {
var bytes by remember { mutableStateOf(ByteArray(0)) }
LaunchedEffect(Unit) { bytes = Res.readBytes("files/sample.png") }
Column {
if (sampleBytes.isNotEmpty())
Image(painter = loadImageBitmap(bytes),
contentDescription = "Sample",
modifier = Modifier.width(200.dp))
}
}
fun loadImageBitmap(bytes: ByteArray) = BitmapPainter(org.jetbrains.skia.Image.makeFromEncoded(bytes).toComposeImageBitmap())
> Exception in thread "main" java.lang.IllegalArgumentException: Failed to Image::makeFromEncoded
> at org.jetbrains.skia.Image$Companion.makeFromEncoded(Image.kt:137)
maybe when you get to your pc and have a moment can try to replicate thiselect
04/10/2024, 9:10 AMAlexander Maryanovsky
04/10/2024, 9:12 AMelect
04/10/2024, 9:14 AMif (bytes.isNotEmpty())
Exception in thread "AWT-EventQueue-0" org.jetbrains.compose.resources.MissingResourceException: Missing resource with path: sample.png
elect
04/10/2024, 9:15 AMelect
04/10/2024, 9:16 AMAlexander Maryanovsky
04/10/2024, 9:21 AMnull
initiallyelect
04/10/2024, 9:21 AMbytes
?Alexander Maryanovsky
04/10/2024, 9:21 AMelect
04/10/2024, 9:27 AMremeber
, or?Alexander Maryanovsky
04/10/2024, 9:28 AMAlexander Maryanovsky
04/10/2024, 9:29 AMelect
04/10/2024, 9:29 AMvar sampleBytes by remember { mutableStateOf(null as ByteArray?) }
?elect
04/10/2024, 9:30 AMvar sampleBytes by remember { mutableStateOf(null as ByteArray?) }
produceState(Unit) { sampleBytes = Res.readBytes("files/sample.png") }
Column {
sampleBytes?.let {
Image(painter = loadImageBitmap(it),
contentDescription = "Sample",
modifier = Modifier.width(200.dp))
}
elect
04/10/2024, 9:30 AMAlexander Maryanovsky
04/10/2024, 9:30 AMAlexander Maryanovsky
04/10/2024, 9:30 AMAlexander Maryanovsky
04/10/2024, 9:31 AMelect
04/10/2024, 9:38 AMAlexander Maryanovsky
04/10/2024, 9:49 AMAlexander Maryanovsky
04/10/2024, 9:50 AMAlexander Maryanovsky
04/10/2024, 9:52 AMval painter by produceState<BitmapPainter?>(initialValue = null, filename) {
val bytes = Res.readBytes(filename)
value = loadImageBitmap(bytes)
}
elect
04/10/2024, 9:59 AM@OptIn(ExperimentalResourceApi::class)
fun main() = singleWindowApplication {
val density = LocalDensity.current
val bitmapPainter by produceState<BitmapPainter?>(initialValue = null) {
value = loadImageBitmap(Res.readBytes("files/sample.png"))
}
val imageVector by produceState<ImageVector?>(initialValue = null) {
value = loadXmlImageVector(Res.readBytes("files/compose-logo.xml"), density)
}
Column {
bitmapPainter?.let {
Image(painter = it,
contentDescription = "Sample",
contentScale = ContentScale.Fit,
modifier = Modifier.width(200.dp))
}
AsyncImage(load = { loadSvgPainter("<https://github.com/JetBrains/compose-multiplatform/raw/master/artwork/idea-logo.svg>", density) },
painterFor = { it },
contentDescription = "Idea logo",
contentScale = ContentScale.FillWidth,
modifier = Modifier.width(200.dp))
imageVector?.let {
Image(painter = rememberVectorPainter(it),
contentDescription = "Compose logo",
contentScale = ContentScale.FillWidth,
modifier = Modifier.width(200.dp))
}
}
}
elect
04/10/2024, 10:01 AMrememberVectorPainter
under Column
since it's a suspend fun