diff --git a/commons/src/androidMain/kotlin/com/vitorpamplona/amethyst/commons/base64Image/Base64ImageBitmap.kt b/commons/src/androidMain/kotlin/com/vitorpamplona/amethyst/commons/base64Image/Base64ImageBitmap.kt index c5b8f2ca3..fc7a2c232 100644 --- a/commons/src/androidMain/kotlin/com/vitorpamplona/amethyst/commons/base64Image/Base64ImageBitmap.kt +++ b/commons/src/androidMain/kotlin/com/vitorpamplona/amethyst/commons/base64Image/Base64ImageBitmap.kt @@ -25,18 +25,10 @@ import android.graphics.BitmapFactory import com.vitorpamplona.amethyst.commons.blurhash.PlatformImage import com.vitorpamplona.amethyst.commons.blurhash.toPlatformImage import com.vitorpamplona.amethyst.commons.richtext.Base64Image -import java.util.Base64 fun Base64Image.toBitmap(content: String): Bitmap { - val matcher = pattern.matcher(content) - - if (matcher.find()) { - val base64String = matcher.group(2) - val byteArray = Base64.getDecoder().decode(base64String) - return BitmapFactory.decodeByteArray(byteArray, 0, byteArray.size) - } - - throw Exception("Unable to convert base64 to image $content") + val byteArray = parse(content) + return BitmapFactory.decodeByteArray(byteArray, 0, byteArray.size) } /** diff --git a/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/richtext/Base64Image.kt b/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/richtext/Base64Image.kt new file mode 100644 index 000000000..b588ea572 --- /dev/null +++ b/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/richtext/Base64Image.kt @@ -0,0 +1,41 @@ +/** + * Copyright (c) 2025 Vitor Pamplona + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the + * Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN + * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +package com.vitorpamplona.amethyst.commons.richtext + +import com.vitorpamplona.amethyst.commons.richtext.RichTextParser +import java.util.Base64 + +object Base64Image { + val pattern = Patterns.BASE64_IMAGE + + fun isBase64(content: String): Boolean = Patterns.BASE64_IMAGE.matches(content) + + fun parse(content: String): ByteArray { + val matcher = pattern.find(content) + if (matcher != null) { + val base64String = matcher.groups[2]?.value + val byteArray = Base64.getDecoder().decode(base64String) + return byteArray + } + + throw Exception("Unable to convert base64 to image $content") + } +} diff --git a/commons/src/jvmMain/kotlin/com/vitorpamplona/amethyst/commons/base64Image/Base64ImagePlatform.jvm.kt b/commons/src/jvmMain/kotlin/com/vitorpamplona/amethyst/commons/base64Image/Base64ImagePlatform.jvm.kt index 50fc059a2..a5d23e969 100644 --- a/commons/src/jvmMain/kotlin/com/vitorpamplona/amethyst/commons/base64Image/Base64ImagePlatform.jvm.kt +++ b/commons/src/jvmMain/kotlin/com/vitorpamplona/amethyst/commons/base64Image/Base64ImagePlatform.jvm.kt @@ -24,23 +24,16 @@ import com.vitorpamplona.amethyst.commons.blurhash.PlatformImage import com.vitorpamplona.amethyst.commons.blurhash.toPlatformImage import com.vitorpamplona.amethyst.commons.richtext.Base64Image import java.io.ByteArrayInputStream -import java.util.Base64 import javax.imageio.ImageIO /** * Converts a base64 image data URI to a PlatformImage (BufferedImage wrapper). */ fun Base64Image.toPlatformImage(content: String): PlatformImage { - val matcher = pattern.matcher(content) + val byteArray = parse(content) - if (matcher.find()) { - val base64String = matcher.group(2) - val byteArray = Base64.getDecoder().decode(base64String) - val bufferedImage = - ImageIO.read(ByteArrayInputStream(byteArray)) - ?: throw Exception("Unable to decode base64 image: $content") - return bufferedImage.toPlatformImage() - } - - throw Exception("Unable to convert base64 to image $content") + val bufferedImage = + ImageIO.read(ByteArrayInputStream(byteArray)) + ?: throw Exception("Unable to decode base64 image: $content") + return bufferedImage.toPlatformImage() }