Skip to content

Instantly share code, notes, and snippets.

@jershell
Last active March 19, 2022 18:07
Show Gist options
  • Save jershell/bf6d628e322e946261b916d581452728 to your computer and use it in GitHub Desktop.
Save jershell/bf6d628e322e946261b916d581452728 to your computer and use it in GitHub Desktop.
jetpack compose desktop svg loader
// implementation("org.apache.xmlgraphics:batik-all:1.13")
// and load svg from resources/svg/pic.svg
// use like Icon(asset = svgAsset("svg/play-button.svg"), modifier = Modifier.width(36.dp) + Modifier.height(36.dp))
import androidx.compose.ui.graphics.ImageAsset
import androidx.compose.ui.graphics.asImageAsset
import org.apache.batik.transcoder.TranscoderInput
import org.apache.batik.transcoder.TranscoderOutput
import org.apache.batik.transcoder.image.PNGTranscoder
import org.jetbrains.skija.Image
import java.io.ByteArrayOutputStream
fun svgAsset(path: String): ImageAsset {
val resource = Thread.currentThread().contextClassLoader.getResource(path)
requireNotNull(resource) { "Resource $path not found" }
return resource.openStream().use {
val buffer = ByteArrayOutputStream()
val transcoderOutput = TranscoderOutput(buffer)
// Convert SVG to PNG
val pngTranscoder = PNGTranscoder()
pngTranscoder.transcode(TranscoderInput(it), transcoderOutput)
val ba = buffer.toByteArray()
// Clean Up
buffer.flush()
buffer.close()
Image.makeFromEncoded(ba).asImageAsset()
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment