基于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
相关产品推荐
相关产品推荐

