@@ -2,8 +2,33 @@ package com.haishinkit.screen
22
33import android.graphics.Bitmap
44import android.graphics.BitmapFactory
5+ import android.net.Uri
56import android.util.Base64
6- import java.io.ByteArrayOutputStream
7+ import androidx.core.net.toUri
8+ import com.haishinkit.util.DataUriUtil
9+
10+ private sealed interface ImageSource {
11+ val uri: Uri
12+
13+ fun toBitmap (): Bitmap
14+
15+ class Data (override val uri : Uri ) : ImageSource {
16+ override fun toBitmap (): Bitmap {
17+ val data = uri.schemeSpecificPart
18+ val base64 = data.substringAfter(" base64," )
19+ val bytes = Base64 .decode(base64, Base64 .DEFAULT )
20+ return BitmapFactory .decodeByteArray(bytes, 0 , bytes.size)
21+ }
22+ }
23+
24+ companion object {
25+ fun parseImageSource (uri : Uri ? ): ImageSource =
26+ when (uri?.scheme) {
27+ " data" -> Data (uri)
28+ else -> error(" unsupported" )
29+ }
30+ }
31+ }
732
833/* *
934 * An object that manages offscreen rendering an image source.
@@ -13,7 +38,7 @@ open class ImageScreenObject(
1338) : ScreenObject(id) {
1439 private interface Keys {
1540 companion object {
16- const val BITMAP : String = " bitmap "
41+ const val SOURCE : String = " source "
1742 }
1843 }
1944
@@ -26,14 +51,28 @@ open class ImageScreenObject(
2651 invalidateLayout()
2752 }
2853
54+ private var source: String? = null
55+ get() {
56+ if (field == null && bitmap != null ) {
57+ return DataUriUtil .encode(bitmap!! )
58+ }
59+ return field
60+ }
61+ set(value) {
62+ field = value
63+ runCatching {
64+ bitmap = ImageSource .parseImageSource(source?.toUri()).toBitmap()
65+ }
66+ }
67+
2968 override var elements: Map <String , String >
3069 get() {
3170 return buildMap {
32- put(Keys .BITMAP , bitmap?.toBase64() ? : " " )
71+ put(Keys .SOURCE , source ? : " " )
3372 }
3473 }
3574 set(value) {
36- bitmap = value[Keys .BITMAP ]?.toBitmap()
75+ source = value[Keys .SOURCE ]
3776 }
3877
3978 init {
@@ -42,22 +81,5 @@ open class ImageScreenObject(
4281
4382 companion object {
4483 const val TYPE : String = " image"
45-
46- private val TAG = VideoScreenObject ::class .java.simpleName
4784 }
4885}
49-
50- private fun String.toBitmap (): Bitmap {
51- val bytes = Base64 .decode(this , Base64 .NO_WRAP )
52- return BitmapFactory .decodeByteArray(bytes, 0 , bytes.size)
53- }
54-
55- private fun Bitmap.toBase64 (
56- format : Bitmap .CompressFormat = Bitmap .CompressFormat .PNG ,
57- quality : Int = 100,
58- ): String {
59- val outputStream = ByteArrayOutputStream ()
60- compress(format, quality, outputStream)
61- val bytes = outputStream.toByteArray()
62- return Base64 .encodeToString(bytes, Base64 .NO_WRAP )
63- }
0 commit comments