// // CameraView.swift // AIGrammar // // Created by oscar on 2024/4/3. // import SwiftUI import UIKit import Vision func performOCR(on uiImage: UIImage, completion: @escaping (String) -> Void) { guard let cgImage = uiImage.cgImage else { return } let handler = VNImageRequestHandler(cgImage: cgImage, options: [:]) let request = VNRecognizeTextRequest { (request, error) in guard let observations = request.results as? [VNRecognizedTextObservation] else { return } let recognizedStrings = observations.compactMap { $0.topCandidates(1).first?.string } completion(recognizedStrings.joined(separator: "\n")) } request.recognitionLanguages = ["en-US", "zh-Hans"] // 根据需要设置支持的语言 request.usesLanguageCorrection = true do { try handler.perform([request]) } catch { print("OCR失败: \(error)") } } struct CameraView: UIViewControllerRepresentable { @Binding var textInput: String @Environment(\.presentationMode) var presentationMode func makeUIViewController(context: Context) -> UIImagePickerController { let picker = UIImagePickerController() picker.delegate = context.coordinator picker.sourceType = .camera picker.allowsEditing = true // 启用编辑模式 return picker } func updateUIViewController(_ uiViewController: UIImagePickerController, context: Context) {} func makeCoordinator() -> Coordinator { Coordinator(self) } class Coordinator: NSObject, UINavigationControllerDelegate, UIImagePickerControllerDelegate { var parent: CameraView init(_ parent: CameraView) { self.parent = parent } func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) { // 尝试获取裁剪后的图片 if let editedImage = info[.editedImage] as? UIImage { // 使用裁剪后的图片进行OCR performOCR(on: editedImage) { recognizedText in // 更新文本输入 self.parent.textInput = recognizedText self.parent.presentationMode.wrappedValue.dismiss() } } else if let originalImage = info[.originalImage] as? UIImage { // 如果用户没有裁剪图片,回退到使用原始图片 performOCR(on: originalImage) { recognizedText in self.parent.textInput = recognizedText self.parent.presentationMode.wrappedValue.dismiss() } } else { // 如果获取图片失败,直接关闭相机视图 self.parent.presentationMode.wrappedValue.dismiss() } } func imagePickerController2(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) { if let uiImage = info[.originalImage] as? UIImage { // 调用OCR处理函数 performOCR(on: uiImage) { recognizedText in // 更新父视图的文本输入 self.parent.textInput = recognizedText } } parent.presentationMode.wrappedValue.dismiss() } } }