92 lines
3.3 KiB
Swift
92 lines
3.3 KiB
Swift
//
|
||
// 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()
|
||
}
|
||
}
|
||
}
|
||
|