浏览代码

custom images

milan jurkulák 2 年之前
父节点
当前提交
14ef18c276

+ 2 - 1
src/main/kotlin/eu/mjdev/desktop/components/image/ImageAny.kt

@@ -24,7 +24,7 @@ import org.jetbrains.skia.Bitmap
 import java.io.File
 import androidx.compose.foundation.Image as ComposeImage
 
-@Suppress("FunctionName")
+@Suppress("FunctionName", "UNUSED_PARAMETER")
 @Composable
 fun ImageAny(
     src: Any? = Icons.Filled.SupervisedUserCircle,
@@ -35,6 +35,7 @@ fun ImageAny(
     alpha: Float = DefaultAlpha,
     colorFilter: ColorFilter? = null,
     filterQuality: FilterQuality = DefaultFilterQuality,
+    placeholder: @Composable () -> Unit = {}, // todo
     onLoading: () -> Unit = {},
     onFail: (error: Throwable) -> Unit = {}
 ) = withDesktopScope {

+ 74 - 0
src/main/kotlin/eu/mjdev/desktop/components/image/ImageColoredBackground.kt

@@ -0,0 +1,74 @@
+/*
+ * Copyright (c) Milan Jurkulák 2024.
+ *  Contact:
+ *  e: mimoccc@gmail.com
+ *  e: mj@mjdev.org
+ *  w: https://mjdev.org
+ */
+
+package eu.mjdev.desktop.components.image
+
+import androidx.compose.foundation.background
+import androidx.compose.foundation.layout.Box
+import androidx.compose.runtime.*
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Brush
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.RectangleShape
+import androidx.compose.ui.graphics.Shape
+import eu.mjdev.desktop.extensions.BitmapUtils.cut
+import eu.mjdev.desktop.extensions.BitmapUtils.topMostColor
+import eu.mjdev.desktop.extensions.ColorUtils.nonAlphaValue
+import eu.mjdev.desktop.extensions.Compose.SuperDarkGray
+import eu.mjdev.desktop.extensions.Modifier.conditional
+import eu.mjdev.desktop.extensions.Image.loadPicture
+
+@Composable
+fun ImageColoredBackground(
+    modifier: Modifier = Modifier,
+    src: Any? = null,
+    shape: Shape = RectangleShape,
+    defaultBackgroundColor: Color = Color.SuperDarkGray,
+    transform: ((color: Color) -> Brush)? = null,
+    contentAlignment: Alignment = Alignment.TopStart,
+    content: @Composable (bckColor: Color) -> Unit = {}
+) {
+    var bckColor by remember(src) { mutableStateOf(defaultBackgroundColor) }
+    Box(
+        modifier = modifier
+            .conditional(transform == null) {
+                background(bckColor, RectangleShape)
+            }
+            .conditional(transform != null) {
+                background(
+                    transform!!.invoke(bckColor),
+                    shape
+                )
+            },
+        contentAlignment = contentAlignment
+    ) {
+        content(bckColor)
+    }
+    LaunchedEffect(src) {
+        runCatching {
+            loadPicture(src).getOrNull()?.let { image ->
+                val width = image.width
+                val height = image.height
+                val imagePart1 = image.cut(0, 0, 64, 64)
+                val imagePart2 = image.cut(width - 64, 0, 64, 64)
+                val imagePart3 = image.cut(0, height - 64, 64, 64)
+                val imagePart4 = image.cut(width - 64, height - 64, 64, 64)
+                val colors = listOf(
+                    imagePart1.topMostColor,
+                    imagePart2.topMostColor,
+                    imagePart3.topMostColor,
+                    imagePart4.topMostColor,
+                )
+                colors.toList().minBy { it.nonAlphaValue }
+            }
+        }.getOrNull()?.let { bc ->
+            bckColor = bc
+        }
+    }
+}

+ 106 - 0
src/main/kotlin/eu/mjdev/desktop/components/image/PhotoImage.kt

@@ -0,0 +1,106 @@
+/*
+ * Copyright (c) Milan Jurkulák 2024.
+ *  Contact:
+ *  e: mimoccc@gmail.com
+ *  e: mj@mjdev.org
+ *  w: https://mjdev.org
+ */
+
+package eu.mjdev.desktop.components.image
+
+import androidx.compose.foundation.shape.RoundedCornerShape
+import androidx.compose.material.icons.Icons
+import androidx.compose.material.icons.filled.BrokenImage
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.ColorFilter
+import androidx.compose.ui.graphics.DefaultAlpha
+import androidx.compose.ui.graphics.Shape
+import androidx.compose.ui.layout.ContentScale
+import androidx.compose.ui.unit.Dp
+import androidx.compose.ui.unit.dp
+
+// todo
+@Composable
+fun PhotoImage(
+    src: Any? = null,
+    modifier: Modifier = Modifier,
+    alignment: Alignment = Alignment.Center,
+    contentScale: ContentScale = ContentScale.Crop,
+    placeholder: @Composable () -> Unit = {
+        ImageAny(
+            modifier = modifier,
+            src = Icons.Filled.BrokenImage,
+            contentScale = contentScale
+        )
+    },
+    alpha: Float = DefaultAlpha,
+    contrast: Float = 5f,
+    brightness: Float = -255f,
+    borderSize: Dp = 2.dp,
+    borderColor: Color = Color.Black,
+    backgroundColor: Color = Color.Black,
+    roundCornerSize: Dp = 8.dp,
+    shape: Shape = RoundedCornerShape(roundCornerSize),
+    colorFilter: ColorFilter? = null,
+    contentDescription: String? = null,
+//    onImageStateChanged: ((state: GlideImageState) -> Unit)? = null
+) {
+    if (src == null) {
+        placeholder()
+    } else {
+        ImageAny (
+            src = src,
+            modifier = modifier
+        )
+//        GlideImage(
+//            imageModel = { src },
+//            modifier = modifier
+//                .defaultMinSize(80.dp)
+//                .conditional(false) {
+//                    aspectRatio(16f / 9f)
+//                }
+//                .border(
+//                    BorderStroke(borderSize, borderColor),
+//                    shape
+//                ),
+//            imageOptions = ImageOptions(
+//                contentScale = contentScale,
+//                alignment = alignment,
+//                contentDescription = contentDescription,
+//                alpha = alpha,
+//                colorFilter = colorFilter,
+//            ),
+//            onImageStateChanged = { state ->
+//                onImageStateChanged?.invoke(state)
+//            },
+//            success = { state, _ ->
+//                val bitmap = state.imageBitmap?.asAndroidBitmap()
+//                Box(
+//                    modifier = modifier.background(bitmap.majorColor(backgroundColor), shape),
+//                ) {
+//                    ImageAny(
+//                        src = bitmap
+//                            ?.toDrawable()
+//                            ?.asPhoto(),
+//                        modifier = modifier,
+//                        alignment = alignment,
+//                        contentScale = contentScale,
+//                        alpha = alpha,
+//                        colorFilter = contrastAndBrightness(
+//                            contrast,
+//                            brightness
+//                        ),
+//                        contentDescription = contentDescription,
+//                    )
+//                }
+//            },
+//            failure = { failure ->
+//                Timber.e(failure.reason)
+//                placeholder()
+//            },
+//        )
+    }
+}