Kamel-Media / Kamel

Kotlin asynchronous media loading and caching library for Compose.
Apache License 2.0
621 stars 24 forks source link

How to load image bitmap? #110

Closed hafiz013 closed 1 month ago

hafiz013 commented 1 month ago

Below here my sample code:

fun CustomImageContainer(
    urlImage:String,
    modifier: Modifier,
    image:ImageBitmap? = null
){
    Box(
        modifier = Modifier.fillMaxWidth(),
        contentAlignment = Alignment.Center
    ) {
        Card(
            colors = CardDefaults.cardColors(containerColor = mediumGrey),
            border = BorderStroke(superDuperSmallPadding, lightGrey),
            modifier = modifier,
            shape = CircleShape
        ) {
            if(image != null){
                Image(image, contentDescription = null, contentScale = ContentScale.Crop)
            }

           KamelImage(
                resource = if(image != null){
                    asyncPainterResource(image)
                } else{
                    asyncPainterResource(urlImage)
                }
                ,
                onLoading = {
                    CustomImage(
                        painterResource(Res.drawable.image_holder),
                        Modifier
                            .align(Alignment.Center)
                    )
                },
                onFailure = {
                    CustomImage(
                        painterResource(Res.drawable.image_holder),
                        Modifier
                            .align(Alignment.Center)
                    )
                },
                contentDescription = null,
                contentScale = ContentScale.None,
                modifier = Modifier.fillMaxSize(),
                animationSpec = tween()
            )
        }
    }
}

however, this code not working :

 if(image != null){
                    asyncPainterResource(image)
}
luca992 commented 1 month ago

There is no need to use kamel if you already have a ImageBitmap you can just supply the ImageBitmap in Image as you are already doing.

hafiz013 commented 1 month ago

@luca992 the reason is that actually, i want to refer to only kamel image only to load data image either from bitmap or url image.

luca992 commented 1 month ago

yeah that's not what Kamel is for. Checkout how it works here:

https://github.com/Kamel-Media/Kamel/blob/96eaad84d1fac4408a940d558c4eb67620f5b1cc/kamel-image/src/commonMain/kotlin/io/kamel/image/AsyncPainterResource.kt#L37-L98

You should just directly use image bitmap with compose image

luca992 commented 1 month ago

if any thing pass a painter to your function instead of urlImage and image. KamelImage should probably handle a normal painter

hafiz013 commented 1 month ago

@luca992 is there way can load byteArray image instead of bitmap?I can supply either bitmap image or byteArray.

hafiz013 commented 1 month ago

@luca992 I do as you suggest using painter but still not working:

@Preview
fun CustomImageContainer(
    urlImage:String,
    modifier: Modifier,
    image:Painter? = null
){
    Box(
        modifier = Modifier.fillMaxWidth(),
        contentAlignment = Alignment.Center
    ) {
        Card(
            colors = CardDefaults.cardColors(containerColor = mediumGrey),
            border = BorderStroke(superDuperSmallPadding, lightGrey),
            modifier = modifier,
            shape = CircleShape
        ) {
           KamelImage(
                resource = if(image != null){
                    asyncPainterResource(image)
                } else{
                    asyncPainterResource(urlImage)
                }
luca992 commented 1 month ago
@OptIn(ExperimentalEncodingApi::class)
@Composable
fun ByteDecoderSample() {
    val base64Image =
        "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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/9k="
    val imageBinary = Base64.decode(base64Image)

    val kamelConfig = remember {
        KamelConfig {
            takeFrom(KamelConfig.Default)
            fetcher(object : Fetcher<ByteArray> {
                override val inputDataKClass: KClass<ByteArray>
                    get() = ByteArray::class
                override val source: DataSource
                    get() = DataSource.Memory

                override fun fetch(
                    data: ByteArray,
                    resourceConfig: ResourceConfig
                ): Flow<Resource<io.ktor.utils.io.ByteReadChannel>> = flow {
                    val byteReadChannel = ByteReadChannel(data)
                    emit(Resource.Success(byteReadChannel, source))
                }

                override val ByteArray.isSupported: Boolean
                    get() = true

            })

        }
    }
    CompositionLocalProvider(LocalKamelConfig provides kamelConfig) {

        Column {
            val painterResource = asyncPainterResource(imageBinary)
            KamelImage({ painterResource },
                contentDescription = null,
                modifier = Modifier.fillMaxSize(),
                onFailure = { throw it })
        }
    }
}

Here's how you can make a fetcher to process data from a ByteArray directly. Working for me:

Screenshot 2024-08-01 at 11 17 18 PM
luca992 commented 1 month ago

I guess maybe I could added that as an optional fetcher on the next beta release. Someone was also asking for a base64 string decoder as well which is along these lines

luca992 commented 1 month ago

It would be more appropriate to make a fetcher to actually fetch the byte array though haha. Hence the whole name "Fetcher"

hafiz013 commented 1 month ago

@luca992 I do this but got crash:

@Composable
@Preview
fun CustomImageContainer(
    urlImage:String,
    modifier: Modifier,
    image:ByteArray? = null
){
    Box(
        modifier = Modifier.fillMaxWidth(),
        contentAlignment = Alignment.Center
    ) {
        Card(
            colors = CardDefaults.cardColors(containerColor = mediumGrey),
            border = BorderStroke(superDuperSmallPadding, lightGrey),
            modifier = modifier,
            shape = CircleShape
        ) {
           KamelImage(
                resource = if(image != null){
                    asyncPainterResource(data = getBinaryImage(image))
                } else{
                    asyncPainterResource(data = urlImage)
                }
                ,
                onLoading = {
                    CustomImage(
                        painterResource(Res.drawable.image_holder),
                        Modifier
                            .align(Alignment.Center)
                    )
                },
                onFailure = {
                    CustomImage(
                        painterResource(Res.drawable.image_holder),
                        Modifier
                            .align(Alignment.Center)
                    )
                },
                contentDescription = null,
                contentScale = ContentScale.None,
                modifier = Modifier.fillMaxSize(),
                animationSpec = tween()
            )
        }
    }
}

@OptIn(ExperimentalEncodingApi::class)
private fun getBinaryImage(image: ByteArray) =  Base64.decode(image)

Is it necessary to add kamelConfig? secondly, it is necessary to decode again of image byteArray?

Thanks.

hafiz013 commented 1 month ago

Error :

Process: , PID: 12978
                                                                                                    java.lang.IllegalArgumentException: Invalid symbol 'ÿ'(377) at index 0
                                                                                                        at kotlin.io.encoding.Base64.decodeImpl(Base64.kt:373)
                                                                                                        at kotlin.io.encoding.Base64.decode(Base64.kt:156)
                                                                                                        at kotlin.io.encoding.Base64.decode$default(Base64.kt:150)
                                                                                                        at ui.themes.WidgetsKt.getBinaryImage(Widgets.kt:443)
                                                                                                        at ui.themes.WidgetsKt.access$getBinaryImage(Widgets.kt:1)
                                                                                                        at ui.themes.WidgetsKt$CustomImageContainer$1$1$1.invoke(Widgets.kt:413)
                                                                                                        at ui.themes.WidgetsKt$CustomImageContainer$1$1$1.invoke(Widgets.kt:410)
                                                                                                        at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:109)
                                                                                                        at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:35)
                                                                                                        at androidx.compose.runtime.CompositionLocalKt.CompositionLocalProvider(CompositionLocal.kt:248)
                                                                                                        at ui.themes.WidgetsKt$CustomImageContainer$1$1.invoke(Widgets.kt:410)
                                                                                                        at ui.themes.WidgetsKt$CustomImageContainer$1$1.invoke(Widgets.kt:385)
                                                                                                        at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:118)
                                                                                                        at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:35)
                                                                                                        at androidx.compose.material3.CardKt$Card$1.invoke(Card.kt:886)
                                                                                                        at androidx.compose.material3.CardKt$Card$1.invoke(Card.kt:93)
                                                                                                        at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:109)
                                                                                                        at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:35)
                                                                                                        at androidx.compose.material3.SurfaceKt$Surface$1.invoke(Surface.kt:134)
                                                                                                        at androidx.compose.material3.SurfaceKt$Surface$1.invoke(Surface.kt:115)
                                                                                                        at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:109)
                                                                                                        at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:35)
                                                                                                        at androidx.compose.runtime.CompositionLocalKt.CompositionLocalProvider(CompositionLocal.kt:228)
                                                                                                        at androidx.compose.material3.SurfaceKt.Surface-T9BRK9s(Surface.kt:112)
                                                                                                        at androidx.compose.material3.CardKt.Card(Card.kt:85)
                                                                                                        at ui.themes.WidgetsKt.CustomImageContainer(Widgets.kt:380)
                                                                                                        at .presentation.screens.editProfile.EditProfileScreen$previewScreen$4$1$1.invoke(EditProfileScreen.kt:130)
                                                                                                        at .presentation.screens.editProfile.EditProfileScreen$previewScreen$4$1$1.invoke(EditProfileScreen.kt:127)
                                                                                                        at androidx.compose.runtime.internal.ComposableLambdaImpl.invoke(ComposableLambda.jvm.kt:118)
                                                                                                        at androidx.compose.runtime.internal.ComposableLambdaImpl$invoke$1.invoke(ComposableLambda.jvm.kt:130)
                                                                                                        at androidx.compose.runtime.internal.ComposableLambdaImpl$invoke$1.invoke(ComposableLambda.jvm.kt:129)
                                                                                                        at androidx.compose.runtime.RecomposeScopeImpl.compose(RecomposeScopeImpl.kt:192)
                                                                                                        at androidx.compose.runtime.ComposerImpl.recomposeToGroupEnd(Composer.kt:2556)
                                                                                                        at androidx.compose.runtime.ComposerImpl.skipCurrentGroup(Composer.kt:2827)
                                                                                                        at androidx.compose.runtime.ComposerImpl.doCompose(Composer.kt:3314)
                                                                                                        at androidx.compose.runtime.ComposerImpl.recompose$runtime_release(Composer.kt:3265)
                                                                                                        at androidx.compose.runtime.CompositionImpl.recompose(Composition.kt:940)
                                                                                                        at androidx.compose.runtime.Recomposer.performRecompose(Recomposer.kt:1155)
                                                                                                        at androidx.compose.runtime.Recomposer.access$performRecompose(Recomposer.kt:127)
                                                                                                        at androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2$1.invoke(Recomposer.kt:583)
                                                                                                        at androidx.compose.runtime.Recomposer$runRecomposeAndApplyChanges$2$1.invoke(Recomposer.kt:551)
                                                                                                        at androidx.compose.ui.platform.AndroidUiFrameClock$withFrameNanos$2$callback$1.doFrame(AndroidUiFrameClock.android.kt:41)
                                                                                                        at androidx.compose.ui.platform.AndroidUiDispatcher.performFrameDispatch(AndroidUiDispatcher.android.kt:109)
                                                                                                        at androidx.compose.ui.platform.AndroidUiDispatcher.access$performFrameDispatch(AndroidUiDispatcher.android.kt:41)
                                                                                                        at androidx.compose.ui.platform.AndroidUiDispatcher$dispatchCallback$1.doFrame(AndroidUiDispatcher.android.kt:69)
2024-08-02 11:31:00.041 12978-12978 AndroidRuntime                          E   at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1687) (Ask Gemini)
                                                                                                        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1698)
                                                                                                        at android.view.Choreographer.doCallbacks(Choreographer.java:1153)
                                                                                                        at android.view.Choreographer.doFrame(Choreographer.java:1069)
                                                                                                        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1646)
                                                                                                        at android.os.Handler.handleCallback(Handler.java:958)
                                                                                                        at android.os.Handler.dispatchMessage(Handler.java:99)
                                                                                                        at android.os.Looper.loopOnce(Looper.java:230)
                                                                                                        at android.os.Looper.loop(Looper.java:319)
                                                                                                        at android.app.ActivityThread.main(ActivityThread.java:8919)
                                                                                                        at java.lang.reflect.Method.invoke(Native Method)
                                                                                                        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:578)
                                                                                                        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1103)
                                                                                                        Suppressed: kotlinx.coroutines.internal.DiagnosticCoroutineContextException: [androidx.compose.runtime.PausableMonotonicFrameClock@7e96727, androidx.compose.ui.platform.MotionDurationScaleImpl@af8fdd4, StandaloneCoroutine{Cancelling}@f52db7d, AndroidUiDispatcher@4d5ba72]
2024-08-02 11:31:00.061 12978-12978 Process                               I  Sending signal. PID: 12978 SIG: 9
luca992 commented 1 month ago

You don't need getBinaryImage. You already have a ByteArray. My example was just decoding an image from a base64 string to a ByteArray. I'm surprised Base64.decode(image) even compiles.

luca992 commented 1 month ago

and yes you would need that fetcher in your config

luca992 commented 1 month ago

Your config only needs to be declared once for your whole app usually in main, or your main activity on android. You can see the sample for examples on all targets

hafiz013 commented 1 month ago

@luca992 no wonder I got crash in ios but in android is ok. Do u have sample to declare once times and use for whole app? by the way that config not effected url image isn't? By the way this one is not android but kotlin multiplatform

hafiz013 commented 1 month ago

By the way @luca992 , it is confirm in ios got crash when do image binary :

Uncaught Kotlin exception: kotlin.IllegalStateException: ComposeScene is closed
    at 0   Katmaans                            0x102e5557f        kfun:kotlin.Throwable#<init>(kotlin.String?){} + 119 
    at 1   Katmaans                            0x102e4eb6b        kfun:kotlin.Exception#<init>(kotlin.String?){} + 115 
    at 2   Katmaans                            0x102e4ed8b        kfun:kotlin.RuntimeException#<init>(kotlin.String?){} + 115 
    at 3   Katmaans                            0x102e4f32b        kfun:kotlin.IllegalStateException#<init>(kotlin.String?){} + 115 
    at 4   Katmaans                            0x103501037        kfun:androidx.compose.ui.scene.SingleLayerComposeSceneImpl.invalidatePositionInWindow#internal + 271 
    at 5   Katmaans                            0x1035c74c7        kfun:androidx.compose.ui.scene.ComposeScene#invalidatePositionInWindow(){}-trampoline + 91 
    at 6   Katmaans                            0x10355859b        kfun:androidx.compose.ui.scene.ComposeSceneMediator.<init>$lambda$14$lambda$13#internal + 1027 
    at 7   Katmaans                            0x10355ef43        kfun:androidx.compose.ui.scene.ComposeSceneMediator.$<init>$lambda$14$lambda$13$FUNCTION_REFERENCE$52.invoke#internal + 87 
    at 8   Katmaans                            0x10355f047        kfun:androidx.compose.ui.scene.ComposeSceneMediator.$<init>$lambda$14$lambda$13$FUNCTION_REFERENCE$52.$<bridge-UNNB>invoke(kotlin.Double){}#internal + 123 
    at 9   Katmaans                            0x102f87613        kfun:kotlin.Function1#invoke(1:0){}1:1-trampoline + 107 
    at 10  Katmaans                            0x10357da33        kfun:androidx.compose.ui.window.ComposeSceneKeyboardOffsetManager.<set-viewBottomOffset>#internal + 203 
    at 11  Katmaans                            0x10357f127        kfun:androidx.compose.ui.window.ComposeSceneKeyboardOffsetManager.animateKeyboard$updateAnimationValues#internal + 375 
    at 12  Katmaans                            0x10357f6cf        kfun:androidx.compose.ui.window.ComposeSceneKeyboardOffsetManager.animateKeyboard$completeAnimation#internal + 463 
    at 13  Katmaans                            0x10357fb1f        kfun:androidx.compose.ui.window.ComposeSceneKeyboardOffsetManager.animateKeyboard$lambda$3#internal + 311 
    at 14  Katmaans                            0x103580653        kfun:androidx.compose.ui.window.ComposeSceneKeyboardOffsetManager.$animateKeyboard$lambda$3$FUNCTION_REFERENCE$4.invoke#internal + 107 
    at 15  Katmaans                            0x1035807d3        kfun:androidx.compose.ui.window.ComposeSceneKeyboardOffsetManager.$animateKeyboard$lambda$3$FUNCTION_REFERENCE$4.$<bridge-UNNB>invoke(kotlin.Boolean){}#internal + 127 
    at 16  Katmaans                            0x102f87613        kfun:kotlin.Function1#invoke(1:0){}1:1-trampoline + 107 
    at 17  Katmaans                            0x103580c67        _6f72672e6a6574627261696e732e636f6d706f73652e75693a75692f6f70742f6275696c644167656e742f776f726b2f386132303736303934356430616562612f636f6d706f73652f75692f75692f7372632f75696b69744d61696e2f6b6f746c696e2f616e64726f6964782f636f6d706f73652f75692f77696e646f772f436f6d706f73655363656e654b6579626f6172644f66667365744d616e616765722e6b74_knbridge35 + 199 
    at 18  UIKitCore                           0x1a828a91b        __UIVIEW_IS_EXECUTING_ANIMATION_COMPLETION_BLOCK__ + 35 
    at 19  UIKitCore                           0x1a833e3af        <redacted> + 103 
    at 20  libdispatch.dylib                   0x1076a4b97        _dispatch_call_block_and_release + 31 
    at 21  libdispatch.dylib                   0x1076a67bb        _dispatch_client_callout + 19 
    at 22  libdispatch.dylib                   0x1076b6d57        _dispatch_main_queue_drain + 1083 
    at 23  libdispatch.dylib                   0x1076b690b        _dispatch_main_queue_callback_4CF + 43 
    at 24  CoreFoundation                      0x1a5fcf70f        <redacted> + 15 
    at 25  CoreFoundation                      0x1a5fcc913        <redacted> + 1995 
    at 26  CoreFoundation                      0x1a5fcbcd7        CFRunLoopRunSpecific + 607 
    at 27  GraphicsServices                    0x1eae7c1a7        GSEventRunModal + 163 
    at 28  UIKitCore                           0x1a860490b        <redacted> + 887 
    at 29  UIKitCore                           0x1a86b89cf        UIApplicationMain + 339 
    at 30  SwiftUI                             0x1aa1bc147        <redacted> + 414603 
    at 31  SwiftUI                             0x1aa168713        <redacted> + 72023 
    at 32  SwiftUI                             0x1aa1744cf        <redacted> + 120595 
    at 33  Katmaans                            0x102458447        $s8Katmaans6iOSAppV5$mainyyFZ + 39 
    at 34  Katmaans                            0x1024584f7        main + 11 
    at 35  dyld                                0x1c967de4b        <redacted> + 2239 

I try do this config in App:

@Composable
fun App(platformModules: List<Module> = emptyList()) {
    KoinApplication(application = { modules(platformModules+applicationModule()) }){
        val isDarkTheme by getTheme().isDarkTheme.collectAsState()
        val userConfig:UserSettingsConfig = koinInject()
        val kamelConfig = remember {
            KamelConfig {
                takeFrom(KamelConfig.Default)
                fetcher(object : Fetcher<ByteArray> {
                    override val inputDataKClass: KClass<ByteArray>
                        get() = ByteArray::class
                    override val source: DataSource
                        get() = DataSource.Memory

                    override fun fetch(
                        data: ByteArray,
                        resourceConfig: ResourceConfig
                    ): Flow<Resource<ByteReadChannel>> = flow {
                        val byteReadChannel = ByteReadChannel(data)
                        emit(Resource.Success(byteReadChannel, source))
                    }

                    override val ByteArray.isSupported: Boolean
                        get() = true

                })

            }
        }
        CompositionLocalProvider(LocalKamelConfig provides kamelConfig) {
            AppTheme(darkTheme =  isDarkTheme) {
                Napier.base(DebugAntilog())
                userConfig.getUserDetails()?.let {
                    Navigator(MainActivity())
                } ?: run {
                    Navigator(LoginScreen())
                }
            }
        }
    }
}

In android working fined, but in ios got crash.

luca992 commented 1 month ago

https://github.com/Kamel-Media/Kamel/blob/v1.0.0/kamel-samples/src/androidMain/kotlin/io/kamel/samples/AndroidSample.kt

https://github.com/Kamel-Media/Kamel/blob/v1.0.0/kamel-samples/src/desktopMain/kotlin/io/kamel/samples/DesktopSample.kt

Here's examples for android and desktop jvm.

Ios would be the same:

https://github.com/Kamel-Media/Kamel/blob/v1.0.0/kamel-samples/src/iosMain/kotlin/main.ios.kt

You'd just wrap launcher in the the CompositionLocalProvider as well if you want to provide your own config

luca992 commented 1 month ago

I think that's unrelated:

https://github.com/JetBrains/compose-multiplatform/issues/4916

hafiz013 commented 1 month ago

Now crash in ios is fixing. Maybe in your latest library and add following below:

in android:

class MainActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        setContent {
            val kamelConfig = remember {
                KamelConfig {
                    takeFrom(KamelConfig.Default)
                    fetcher(object : Fetcher<ByteArray> {
                        override val inputDataKClass: KClass<ByteArray>
                            get() = ByteArray::class
                        override val source: DataSource
                            get() = DataSource.Memory

                        override fun fetch(
                            data: ByteArray,
                            resourceConfig: ResourceConfig
                        ): Flow<Resource<ByteReadChannel>> = flow {
                            val byteReadChannel = ByteReadChannel(data)
                            emit(Resource.Success(byteReadChannel, source))
                        }

                        override val ByteArray.isSupported: Boolean
                            get() = true

                    })

                }
            }
            val preferences = PreferenceManager.getDefaultSharedPreferences(LocalContext.current)
            CompositionLocalProvider(LocalKamelConfig provides kamelConfig) {
                App(androidPlatformModules(preferences))
            }
        }
    }
}

and inside iosMain:

fun MainViewController(): UIViewController {
    return ComposeUIViewController {
        val kamelConfig = remember {
            KamelConfig {
                takeFrom(KamelConfig.Default)
                fetcher(object : Fetcher<ByteArray> {
                    override val inputDataKClass: KClass<ByteArray>
                        get() = ByteArray::class
                    override val source: DataSource
                        get() = DataSource.Memory

                    override fun fetch(
                        data: ByteArray,
                        resourceConfig: ResourceConfig
                    ): Flow<Resource<ByteReadChannel>> = flow {
                        val byteReadChannel = ByteReadChannel(data)
                        emit(Resource.Success(byteReadChannel, source))
                    }

                    override val ByteArray.isSupported: Boolean
                        get() = true

                })

            }
        }
        CompositionLocalProvider(LocalKamelConfig provides kamelConfig) {
            App(iosPlatformModules)
        }
    }
}

Nice super awesome all work now in byteArray Image load. Thanks bro for guide @luca992

hafiz013 commented 1 month ago

@luca992 , owh my god now my picture is not load. Does that config effected url load image?

luca992 commented 1 month ago

as long as you have takeFrom(KamelConfig.Default) it should be able to fetch remote images. All that adding another fetcher (Fetcher<ByteArray>) does is add a handler for getting image data from ByteArray

hafiz013 commented 1 month ago

@luca992 it con take image byteArray but when api have url image and it is can't take that url anymore.

luca992 commented 1 month ago

Hard to know without a stack trace

luca992 commented 1 month ago

if you updated to the latest 1.0 beta 7 make sure you are using Ktor 3.0.0-beta-2, or try using ktor 2.3.11 if you are on 0.9.5

hafiz013 commented 1 month ago

My ktor 2.3.11 and kamel libary 0.9.5 I do exactly this settings:

val kamelConfig = remember {
        KamelConfig {
            takeFrom(KamelConfig.Default)
            fetcher(object : Fetcher<ByteArray> {
                override val inputDataKClass: KClass<ByteArray>
                    get() = ByteArray::class
                override val source: DataSource
                    get() = DataSource.Memory

                override fun fetch(
                    data: ByteArray,
                    resourceConfig: ResourceConfig
                ): Flow<Resource<io.ktor.utils.io.ByteReadChannel>> = flow {
                    val byteReadChannel = ByteReadChannel(data)
                    emit(Resource.Success(byteReadChannel, source))
                }

                override val ByteArray.isSupported: Boolean
                    get() = true

            })

        }
    }

Unfortunaly , only work for byte array image but url image not working.

hafiz013 commented 1 month ago

@luca992 neither log that I can refer too..

luca992 commented 1 month ago

do the remote images load when you remove the custom bytearray fetcher? If not then the fetcher isn't the issue. You can try stepping through to see what the issue is.

hafiz013 commented 1 month ago

do the remote images load when you remove the custom bytearray fetcher?

Answer : let me test this.

hafiz013 commented 1 month ago

@luca992 ok I got it. the main reason behind this is because of my url image is broken. Ok now can close permanently this case. thanks for help.

luca992 commented 1 month ago

That will do it. Should be returning the error in onFailure which looks like you are ignoring.

hafiz013 commented 1 month ago

@luca992 , nope i do load error image onFailure function. thanks