2015-10-16 5 views
7

ズームカメラにピンチをかけようとしていますが、私は2つの問題に直面しています。第1に、ユーザーがズームアウトしすぎて、ズームアウトすることができないことです。第2に、ズームインした画像を撮っていないときに撮影します。ここにピンチ機能のコードがあります...ズームカメラにピンチします

func pinch(pinch: UIPinchGestureRecognizer) { 
    if let view = cameraView { 
     view.transform = CGAffineTransformScale(view.transform, 
      pinch.scale, pinch.scale) 
      pinch.scale = 1 
    } 

} 

これ以上コードを表示する必要がある場合は教えてください。ありがとう!

答えて

7

カメラの実装で同じ問題が発生しました。これを解決するには、2つのことを知る必要があります。

  • ズームの最大値と最小値は値の範囲内になければなりません。そうでないと、カメラのズームが大きくなりすぎます。
  • ズームインされたイメージを保存していない実際のイメージと同じように、これはオンライン上の多くの解決策がカバーしていない一般的なバグです。実際には、ビューのズームのみを変更しているため、実際のAVCaptureDeviceのズームは変更されていないためです。

は、あなたがこのような何かを必要とする二つのことを変更するには:あなたは私が使用していますキャプチャデバイスを追跡するために、ビデオデバイス(videoDevice)のクラス変数を使っ見ることができるように

func pinch(pinch: UIPinchGestureRecognizer) { 
    var device: AVCaptureDevice = self.videoDevice 
    var vZoomFactor = ((gestureRecognizer as! UIPinchGestureRecognizer).scale) 
    var error:NSError! 
     do{ 
      try device.lockForConfiguration() 
      defer {device.unlockForConfiguration()} 
      if (vZoomFactor <= device.activeFormat.videoMaxZoomFactor){ 
       device.videoZoomFactor = vZoomFactor 
      }else{ 
      NSLog("Unable to set videoZoom: (max %f, asked %f)", device.activeFormat.videoMaxZoomFactor, vZoomFactor); 
      } 
     }catch error as NSError{ 
      NSLog("Unable to set videoZoom: %@", error.localizedDescription); 
     }catch _{ 

     } 
} 

ビジュアルコンポーネント用。ズームを特定の範囲に制限し、ビュー自体ではなく、デバイスのズームプロパティを変更します。

+3

不足している一つのことがあります。現在のズーム係数を追跡し、設定するズーム係数の計算に使用する必要があります。しかし、偉大な答えをありがとう! – stonecompass

1
var device: AVCaptureDevice = self.backCamera 
    var vZoomFactor = sender.scale 
    var error:NSError! 
    do{ 
     try device.lockForConfiguration() 
     defer {device.unlockForConfiguration()} 
     if (vZoomFactor <= device.activeFormat.videoMaxZoomFactor) { 

      let desiredZoomFactor:CGFloat = vZoomFactor + atan2(sender.velocity, 5.0); 
      device.videoZoomFactor = max(1.0, min(desiredZoomFactor, device.activeFormat.videoMaxZoomFactor)); 
     } 
     else { 

      NSLog("Unable to set videoZoom: (max %f, asked %f)", device.activeFormat.videoMaxZoomFactor, vZoomFactor); 
     } 
    } 
    catch error as NSError{ 

     NSLog("Unable to set videoZoom: %@", error.localizedDescription); 
    } 
    catch _{ 

    } 
0

手動zoomTo(2.0)機能が必要な場合は、Ritvik Upadhyayaの答えに展開するには、この

// Create listener for Pinch to Zoom 
let pinchRecognizer = UIPinchGestureRecognizer(target: self, action:#selector(FSCameraView.pinchToZoom(_:))) 
pinchRecognizer.delegate = self 
self.previewViewContainer.addGestureRecognizer(pinchRecognizer) 

// set the zoom to a zoomed in mode from start 
setZoom(CGFloat(2.0) 



// and the functions 
func pinchToZoom(sender:UIPinchGestureRecognizer) { 
    var vZoomFactor = ((sender as! UIPinchGestureRecognizer).scale) 
    setZoom(vZoomFactor) 
} 

func setZoom(zoomFactor:CGFloat) { 
    var device: AVCaptureDevice = self.device! 
    var error:NSError! 
    do{ 
     try device.lockForConfiguration() 
     defer {device.unlockForConfiguration()} 
     if (zoomFactor <= device.activeFormat.videoMaxZoomFactor) { 

      let desiredZoomFactor:CGFloat = zoomFactor + atan2(sender.velocity, 5.0); 
      device.videoZoomFactor = max(1.0, min(desiredZoomFactor, device.activeFormat.videoMaxZoomFactor)); 
     } 
     else { 
      NSLog("Unable to set videoZoom: (max %f, asked %f)", device.activeFormat.videoMaxZoomFactor, zoomFactor); 
     } 
    } 
    catch error as NSError{ 
     NSLog("Unable to set videoZoom: %@", error.localizedDescription); 
    } 
    catch _{ 
    } 
} 
1

を使用することができ、あなたも計算する前のズーム倍率を保存する必要があります新しいものでは、指を持ち上げて再度ズームしようとするたびにズーミングを通常に戻すことは望ましくありません。

// To track the zoom factor 
var prevZoomFactor: CGFloat = 1 

func pinch(pinch: UIPinchGestureRecognizer) { 
    var device: AVCaptureDevice = self.videoDevice 

    // Here we multiply vZoomFactor with the previous zoom factor if it exist. 
    // Else just multiply by 1 
    var vZoomFactor = pinch.scale * prevZoomFactor 

    // If the pinching has ended, update prevZoomFactor. 
    // Note that we set the limit at 1, because zoom factor cannot be less than 1 or the setting device.videoZoomFactor will crash 
    if sender.state == .ended { 
     prevZoomFactor = zoomFactor >= 1 ? zoomFactor : 1 
    } 

    do { 
     try device.lockForConfiguration() 
     defer {device.unlockForConfiguration()} 
     if (vZoomFactor <= device.activeFormat.videoMaxZoomFactor) { 
      device.videoZoomFactor = vZoomFactor 
     } else { 
      print("Unable to set videoZoom: (max \(device.activeFormat.videoMaxZoomFactor), asked \(vZoomFactor))") 
     } 
    } catch { 
     print("\(error.localizedDescription)") 
    } 
} 
+1

こんにちは。 vZoomFactorが1.0より小さい場合、アプリケーションがクラッシュしないでしょうか? –

14

スウィフト3.0

let minimumZoom: CGFloat = 1.0 
let maximumZoom: CGFloat = 3.0 
var lastZoomFactor: CGFloat = 1.0 

func pinch(_ pinch: UIPinchGestureRecognizer) { 
    guard let device = videoDeviceInput.device else { return } 

    // Return zoom value between the minimum and maximum zoom values 
    func minMaxZoom(_ factor: CGFloat) -> CGFloat { 
     return min(min(max(factor, minimumZoom), maximumZoom), device.activeFormat.videoMaxZoomFactor) 
    } 

    func update(scale factor: CGFloat) { 
     do { 
      try device.lockForConfiguration() 
      defer { device.unlockForConfiguration() } 
      device.videoZoomFactor = factor 
     } catch { 
      print("\(error.localizedDescription)") 
     } 
    } 

    let newScaleFactor = minMaxZoom(pinch.scale * lastZoomFactor) 

    switch pinch.state { 
    case .began: fallthrough 
    case .changed: update(scale: newScaleFactor) 
    case .ended: 
     lastZoomFactor = minMaxZoom(newScaleFactor) 
     update(scale: lastZoomFactor) 
    default: break 
    } 
} 
+0

これは私のために働いた、ありがとう! – Kushagra

+0

大変感謝しています...ありがとうございました –

+0

ありがとうございました。完璧な答え...! –

関連する問題