2017-04-08 128 views
1

照片时不旋转保存旋转图片(swift3)

picture without rotation

图片与旋转

picture with rotation

所有我想要做的就是采取保存与旋转照片。完全像旋转的图片,使用基于avfoundation的自定义相机。现在我的代码拍摄照片并将它们保存到照片库中,就像没有旋转的照片一样。

import UIKit 
import AVFoundation 


class ViewController: UIViewController, AVCapturePhotoCaptureDelegate { 
@IBOutlet var cameraDisplay: UIView! 

var captureSession : AVCaptureSession! 
var cameraOutput : AVCapturePhotoOutput! 
var previewLayer : AVCaptureVideoPreviewLayer! 

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 
    captureSession = AVCaptureSession() 
    captureSession.sessionPreset = AVCaptureSessionPresetPhoto 
    cameraOutput = AVCapturePhotoOutput() 


    let device = AVCaptureDevice.defaultDevice(withMediaType: AVMediaTypeVideo) 

    if let input = try? AVCaptureDeviceInput(device: device) { 
     if (captureSession.canAddInput(input)) { 
      captureSession.addInput(input) 
      if (captureSession.canAddOutput(cameraOutput)) { 
       captureSession.addOutput(cameraOutput) 


       previewLayer = AVCaptureVideoPreviewLayer(session: captureSession) 
       previewLayer.frame = CGRect(x: 10, y: 10, width: 700, height: 700) 




       cameraDisplay.layer.addSublayer(previewLayer) 
       captureSession.startRunning() 

      }}}} 


      func image(_ image: UIImage, didFinishSavingWithError error: NSError?, contextInfo: UnsafeRawPointer) { 
       if let error = error { 
        // we got back an error! 
        let ac = UIAlertController(title: "Save error", message: error.localizedDescription, preferredStyle: .alert) 
        ac.addAction(UIAlertAction(title: "OK", style: .default)) 
        present(ac, animated: true) 
       } else { 

        let ac = UIAlertController(title: "Image Saved!", message: "Your image has been saved to your photos.", preferredStyle: .alert) 
        ac.addAction(UIAlertAction(title: "OK", style: .default)) 
        present(ac, animated: true) 
       } 
      } 

func capture(_ captureOutput: AVCapturePhotoOutput, didFinishProcessingPhotoSampleBuffer photoSampleBuffer: CMSampleBuffer?, previewPhotoSampleBuffer: CMSampleBuffer?, resolvedSettings: AVCaptureResolvedPhotoSettings, bracketSettings: AVCaptureBracketedStillImageSettings?, error: Error?) { 
    if let sampleBuffer = photoSampleBuffer, 
     let previewBuffer = previewPhotoSampleBuffer, 


     let dataImage = AVCapturePhotoOutput.jpegPhotoDataRepresentation(forJPEGSampleBuffer: sampleBuffer, previewPhotoSampleBuffer: previewBuffer){ 


     let dataProvider = CGDataProvider(data: dataImage as CFData) 
     let cgImageRef: CGImage! = CGImage(jpegDataProviderSource: dataProvider!, decode: nil, shouldInterpolate: true, intent: .defaultIntent) 
     let imagea = UIImage(cgImage: cgImageRef, scale: 1.0, orientation: UIImageOrientation.right) 

     UIImageWriteToSavedPhotosAlbum(imagea, self, #selector(self.image(_:didFinishSavingWithError:contextInfo:)), nil) 



    }} 



@IBAction func TakePhoto(_ sender: Any) { 
    let settings = AVCapturePhotoSettings() 
    let previewpixel = settings.availablePreviewPhotoPixelFormatTypes.first! 
    let previewformat = [ 
     kCVPixelBufferPixelFormatTypeKey as String: previewpixel, kCVPixelBufferWidthKey as String: 160, 
     kCVPixelBufferHeightKey as String : 160] 

    settings.previewPhotoFormat = previewformat 
    cameraOutput.capturePhoto(with: settings, delegate: self) 
    }} 
+0

你知道旋转角吗? –

+0

是啊逆时针90度。所以我去 - 90度。 –

回答

2

更改以下行

UIImage(cgImage: (otherImage?.cgImage!)!, scale: CGFloat(1.0), orientation: .right) 

UIImage(cgImage: (otherImage?.cgImage!)!, scale: CGFloat(1.0), orientation: .up) 
+0

你知道我怎么能取决于设备在纵向或横向的天气? –

+0

你想知道该设备是在肖像或landscepae? –

+0

现在它将是肖像。但是,如果设备处于纵向图像方向是正确的,但是如果设备处于横向图像方向,则我想沿着线做一些事情。 –

0

您也可以拨打 如果让连接= cameraOutput.connection(withMediaType:AVMediaTypeVideo){ connection.videoOrientation =方向 调用cameraOutput.capturePhoto()之前调用 。可变定位类型是enum AVCaptureVideoOrientation