You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Kotlin Compose Multiplatform Desktop调用摄像头并拍照

Kotlin Compose Multiplatform Desktop 简易调用摄像头拍照方案

针对仅需基础拍照的需求,无需复杂的OpenCV,直接借助Compose Desktop底层依赖的JavaFX API即可实现,步骤如下:

核心实现思路

利用JavaFX的MediaDevices获取系统摄像头,通过MediaCapture实现画面预览与拍照,再通过Compose的JavaFxComponent将预览画面嵌入Compose界面。

完整代码示例

import androidx.compose.foundation.layout.*
import androidx.compose.material.Button
import androidx.compose.material.Text
import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import androidx.compose.ui.window.Window
import androidx.compose.ui.window.application
import javafx.scene.image.ImageView
import javafx.scene.media.MediaCapture
import javafx.scene.media.MediaDevices
import java.io.File

fun main() = application {
    Window(title = "摄像头拍照工具", onCloseRequest = ::exitApplication) {
        var imageView by remember { mutableStateOf<ImageView?>(null) }
        var capture: MediaCapture? by remember { mutableStateOf(null) }

        LaunchedEffect(Unit) {
            // 获取默认摄像头
            val camera = MediaDevices.getDefaultVideoDevice()
            camera?.let {
                val mediaCapture = MediaCapture(it)
                val preview = ImageView().apply {
                    fitWidth = 640.0
                    fitHeight = 480.0
                    isPreserveRatio = true
                }
                mediaCapture.start()
                preview.image = mediaCapture.view
                imageView = preview
                capture = mediaCapture
            }
        }

        Column(
            modifier = Modifier.fillMaxSize().padding(16.dp),
            horizontalAlignment = Alignment.CenterHorizontally,
            verticalArrangement = Arrangement.Center
        ) {
            imageView?.let { view ->
                JavaFxComponent(
                    modifier = Modifier.size(640.dp, 480.dp),
                    factory = { view }
                )
                Spacer(modifier = Modifier.height(16.dp))
                Button(onClick = {
                    capture?.let { cap ->
                        // 拍照并保存到指定路径
                        val photoFile = File(System.getProperty("user.home"), "camera_photo.jpg")
                        cap.takePhoto(photoFile)
                    }
                }) {
                    Text("拍照")
                }
            } ?: Text("未检测到可用摄像头")
        }
    }
}

注意事项

  • 权限配置:Windows/macOS/Linux需要开启应用的摄像头访问权限,首次运行系统会弹出权限请求,允许即可。
  • 路径调整:代码中默认将照片保存到用户目录下的camera_photo.jpg,可根据需求修改photoFile的路径。
  • 依赖说明:Compose Desktop项目默认已包含JavaFX相关依赖,无需额外添加。

内容的提问来源于stack exchange,提问作者codaman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 01:01:06