Захват изображения для широкоугольного и сверхширокоугольного режима [закрыто]IOS

Программируем под IOS
Ответить
Anonymous
 Захват изображения для широкоугольного и сверхширокоугольного режима [закрыто]

Сообщение Anonymous »


У меня возникла проблема с настройкой параметров широкоугольного и сверхширокоугольного режима приложения камеры. Я использую сегментированный элемент управления для изменения угла:
импортировать UIKit импортировать AVFoundation импортировать фотографии импортировать CoreMotion класс cameraViewController: UIViewController, AVCapturePhotoCaptureDelegate, UIGestureRecouncerDelegate { вар cameraView: UIView! вар captureButton: UIButton! вар cameraSwitchButton: UIButton! вар flashModeButton: UIButton! //var backCamera: AVCaptureDevice! вар currentCamera: AVCaptureDevice? вар captureSession: AVCaptureSession! вар StillImageOutput: AVCapturePhotoOutput! вар просмотр слоя: AVCaptureVideoPreviewLayer! вар currentZoomFactor: CGFloat = 1,0 вар maxZoomFactor: CGFloat = 5.0 вар ZoomStep: CGFloat = 1.0 var currentFlashMode: AVCaptureDevice.FlashMode = .auto // устанавливаем автоматический режим вспышки вар isFlashOn: Bool = ложь варexpositionPoint = CGPoint(x: 0,5, y: 0,5) вар focusPoint = CGPoint (x: 0,5, y: 0,5) вар boxView: UIView! варexpositionSlider: UISlider! вар currentExposureBias: Float = 0,0 вар currentFocusLevel: Float = 0,0 вар motionManager: CMMotionManager! вар yawAngle: Double = 0,0 вар аспектКонтрол: UISegmentedControl! // элемент управления сегментом для выбора соотношения сторон var currentAspectRatio: AVCaptureSession.Preset = .hd1920x1080 // устанавливаем соотношение сторон по умолчанию в сеансе захвата вар timerButton: UIButton! вар timerDuration: TimeInterval = 0 вар timerLabel: UILabel! вар таймер: Таймер? вар styleButton: UIButton! вар levelView: UIView! Толерантность к переменной: CGFloat = 4,0 вар StraightAngle: CGFloat = 0,0 var WideControll: UISegmentedControl! переопределить функцию viewDidLoad() { супер.viewDidLoad() настройкаКамераВью() настройкаКамера() НастройкаКнопки() настройкаBoxView() настройкаExposureSlider() настройкаЖесты() настройкаMotionManager() настройкаLevelView() let items = ["Широкий угол", "Сверхширокий угол"] WideControll = UISegmentedControl (элементы: элементы) WideControll?.frame = CGRect(x: 50, y: 50, ширина: 300, высота: 50) WideControll?.selectedSegmentIndex = 0 // Установите для выбранного сегмента по умолчанию значение «Широкий угол» // WideControll?.addTarget(self, action: #selector(wideAngleValueChanged(_:)), for: .valueChanged) view.addSubview(wideControll!) } //он использовался для скрытия строки состояния на дисплее, например: статус батареи, сигнал переопределить var предпочитаетStatusBarHidden: Bool{ вернуть истину } переопределить var supportInterfaceOrientations: UIInterfaceOrientationMask { вернуть .портрет } переопределить func viewDidAppear(_animated: Bool) { super.viewDidAppear(анимированный) PreviewLayer?.connection?.videoOrientation = currentVideoOrientation() PreviewLayer?.frame = cameraView.bounds // предварительный просмотрLayer.videoGravity = .resizeAspect } переопределить func viewWillTransition(to size: CGSize, с координатором: UIViewControllerTransitionCoordinator) { super.viewWillTransition(до: размера, с: координатором) coordinator.animate(alongsideTransition: { _ in self.previewLayer?.connection?.videoOrientation = self.currentVideoOrientation() self.previewLayer?.frame = CGRect(x: 0, y: 0, ширина: size.width, высота: size.height) }, завершение: { _ в // Обработчик завершения, если необходимо }) } переопределить func viewWillAppear(_animated: Bool) { super.viewWillAppear(анимированный) captureSession.startRunning() } переопределить func viewWillDisappear(_animated: Bool) { super.viewWillDisappear(анимированный) captureSession.stopRunning() } func toggleButtonsVisibility(_ mustHide: Bool) { DispatchQueue.main.async { self.flashModeButton.isHidden = следует скрыть self.aspectControll.isHidden = следуетСкрыть self.timerButton.isHidden = следует скрыть self.timerLabel.isHidden = следует скрыть self.styleButton.isHidden = следует скрыть } } функция setupCameraView() { камераView = UIView() cameraView.translatesAutoresizingMaskIntoConstraints = false view.addSubview(cameraView) NSLayoutConstraint.activate([ cameraView.leadingAnchor.constraint(equalTo: view.leadingAnchor), cameraView.trailingAnchor.constraint(equalTo: view.trailingAnchor), cameraView.topAnchor.constraint(equalTo: view.topAnchor), cameraView.bottomAnchor.constraint(equalTo: view.bottomAnchor) ]) } функция setupLevelView() { levelView = UIView(frame: CGRect(x: 0, y: 0, ширина: cameraView.frame.width, высота: 2)) levelView.backgroundColor = UIColor.red cameraView.addSubview(levelView) //levelView.translatesAutoresizingMaskIntoConstraints = false // Добавляем ограничения центра для levelView NSLayoutConstraint.activate([ levelView.centerXAnchor.constraint(equalTo: cameraView.centerXAnchor), levelView.centerYAnchor.constraint(equalTo: cameraView.centerYAnchor), levelView.widthAnchor.constraint(equalTo: cameraView.widthAnchor, множитель: 1,0), levelView.heightAnchor.constraint(equalToConstant: 2) ]) print("Рамка просмотра уровня: \(levelView.frame)") print("Границы просмотра уровня: \(levelView.bounds)") } функция setupCamera() { captureSession = AVCaptureSession() captureSession.sessionPreset = currentAspectRatio если пусть устройство = AVCaptureDevice.default(for:.video){ // задняя камера = устройство делать { let input = попробуйте AVCaptureDeviceInput (устройство: устройство) если captureSession.canAddInput(вход) { captureSession.addInput(вход) } StillImageOutput = AVCapturePhotoOutput() // Инициализируем его как AVCapturePhotoOutput if captureSession.canAddOutput(stillImageOutput) { // Разворачиваем необязательный captureSession.addOutput(stillImageOutput) } PreviewLayer = AVCaptureVideoPreviewLayer (сессия: captureSession) cameraView?.layer.addSublayer(previewLayer) DispatchQueue.global(qos:.userInitiated).async { self.captureSession.startRunning() } } ловить { print("Ошибка настройки камеры: \(ошибка)") } } } функция setupCamera2() { captureSession = AVCaptureSession() captureSession.sessionPreset = currentAspectRatio if let device = AVCaptureDevice.default(.builtInUltraWideCamera, for: .video, Position: .back){ // задняя камера = устройство делать { let input = попробуйте AVCaptureDeviceInput (устройство: устройство) если captureSession.canAddInput(вход) { captureSession.addInput(вход) } StillImageOutput = AVCapturePhotoOutput() // Инициализируем его как AVCapturePhotoOutput if captureSession.canAddOutput(stillImageOutput!) { // Разворачиваем необязательный captureSession.addOutput(stillImageOutput!) } PreviewLayer = AVCaptureVideoPreviewLayer (сессия: captureSession) cameraView?.layer.addSublayer(previewLayer) DispatchQueue.global(qos:.userInitiated).async { self.captureSession.startRunning() } } ловить { print("Ошибка настройки камеры: \(ошибка)") } } } @objc func WideAngleValueChanged (_ отправитель: UISegmentedControl) { если sender.selectedSegmentIndex == 0 { настройкаКамера() } else if sender.selectedSegmentIndex == 1 { настройкаКамера2() } поменяй камеру() } func getUltraWideCamera() -> AVCaptureDevice? { для устройства в AVCaptureDevice.DiscoverySession(deviceTypes: [.builtInDualCamera], mediaType: .video, Position: .back).devices { если устройство.deviceType == .builtInUltraWideCamera { возвратное устройство } } вернуть ноль } func getWideAngleCamera() -> AVCaptureDevice? { для устройства в AVCaptureDevice.DiscoverySession(deviceTypes: [.builtInDualCamera], mediaType: .video, Position: .back).devices { если устройство.deviceType == .builtInWideAngleCamera { возвратное устройство } } вернуть ноль } функция измененияКамера() { captureSession.beginConfiguration() охранник пусть currentInput = captureSession.inputs.first как? AVCaptureDeviceInput еще {возврат} captureSession.removeInput(currentInput) let newCamera = (currentInput.device.position == .back) ? getUltraWideCamera() : getWideAngleCamera() делать { let newInput = попробуйте AVCaptureDeviceInput (устройство: newCamera!) captureSession.addInput(новыйВход) } ловить { печать (ошибка) } captureSession.commitConfiguration() // Добавьте эту строку, чтобы зафиксировать изменения конфигурации // Запускаем или перезапускаем сеанс после фиксации изменений конфигурации если !captureSession.isRunning { captureSession.startRunning() } }
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»