2016-11-27 10 views
0

Я собираю изображение, которое затем помещается в небольшое изображение. Изображение не размыто в маленьком изображенииView, но когда я копирую его в буфер обмена, я изменяю размер изображения так, чтобы он был такого же размера, как и ImageView, но теперь он размывается, когда я вставляю.Уменьшенное изображение становится размытым после копирования в Pasteboard - Swift 3.0

Вот код:

import UIKit 
import AVFoundation 

class ViewController: UIViewController, UINavigationControllerDelegate, UIImagePickerControllerDelegate { 
    @IBOutlet weak var cameraView: UIView! 
    @IBOutlet weak var imageView: UIImageView! 

    var session: AVCaptureSession? 
    var stillImageOutput: AVCaptureStillImageOutput? 
    var videoPreviewLayer: AVCaptureVideoPreviewLayer? 
    var captureDevice:AVCaptureDevice? 
    var imagePicker: UIImagePickerController! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     alignment() 
     tapToCopy() 
    } 

    override func viewWillAppear(_ animated: Bool) { 
     session = AVCaptureSession() 
     session!.sessionPreset = AVCaptureSessionPresetPhoto 

     let videoDevices = AVCaptureDevice.devices(withMediaType: AVMediaTypeVideo) 

     for device in videoDevices!{ 
      let device = device as! AVCaptureDevice 
      if device.position == AVCaptureDevicePosition.front { 
       captureDevice = device 
      } 
     } 

     //We will make a new AVCaptureDeviceInput and attempt to associate it with our backCamera input device. 
     //There is a chance that the input device might not be available, so we will set up a try catch to handle any potential errors we might encounter. 
     var error: NSError? 
     var input: AVCaptureDeviceInput! 
     do { 
      input = try AVCaptureDeviceInput(device: captureDevice) 
     } catch let error1 as NSError { 
      error = error1 
      input = nil 
      print(error!.localizedDescription) 
     } 

     if error == nil && session!.canAddInput(input) { 
      session!.addInput(input) 
      // ... 
      // The remainder of the session setup will go here... 

      stillImageOutput = AVCaptureStillImageOutput() 
      stillImageOutput?.outputSettings = [AVVideoCodecKey: AVVideoCodecJPEG] 

      if session!.canAddOutput(stillImageOutput) { 
       session!.addOutput(stillImageOutput) 
       // ... 
       // Configure the Live Preview here... 

       videoPreviewLayer = AVCaptureVideoPreviewLayer(session: session) 
       videoPreviewLayer!.videoGravity = AVLayerVideoGravityResizeAspect 
       videoPreviewLayer!.connection?.videoOrientation = AVCaptureVideoOrientation.portrait 
       cameraView.layer.addSublayer(videoPreviewLayer!) 
       session!.startRunning() 
      } 
     } 
    } 

    func alignment() { 
     let height = view.bounds.size.height 
     let width = view.bounds.size.width 

     cameraView.bounds.size.height = height/10 
     cameraView.bounds.size.width = height/10 
     cameraView.layer.cornerRadius = height/20 

     imageView.bounds.size.height = height/10 
     imageView.bounds.size.width = height/10 
     imageView.layer.cornerRadius = height/20 
     imageView.clipsToBounds = true 
    } 

    override func viewDidAppear(_ animated: Bool) { 
     super.viewDidAppear(animated) 
     videoPreviewLayer!.frame = cameraView.bounds 
    } 

    @IBAction func takePic(_ sender: Any) { 
     if (stillImageOutput!.connection(withMediaType: AVMediaTypeVideo)) != nil { 
      let videoConnection = stillImageOutput!.connection(withMediaType: AVMediaTypeVideo) 
      // ... 
      // Code for photo capture goes here... 
      stillImageOutput?.captureStillImageAsynchronously(from: videoConnection, completionHandler: { (sampleBuffer, error) -> Void in 
       // ... 
       // Process the image data (sampleBuffer) here to get an image file we can put in our captureImageView 

       if sampleBuffer != nil { 
        let imageData = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(sampleBuffer) 
        let dataProvider = CGDataProvider(data: imageData as! CFData) 
        let cgImageRef = CGImage(jpegDataProviderSource: dataProvider!, decode: nil, shouldInterpolate: true, intent: CGColorRenderingIntent.defaultIntent) 
        let image = UIImage(cgImage: cgImageRef!, scale: 1.0, orientation: UIImageOrientation.right) 
        // ... 
        // Add the image to captureImageView here... 

        self.imageView.image = self.resizeImage(image: image, newHeight: self.view.bounds.size.height/10) 
       } 
      }) 
     } 
    } 

    func tapToCopy() { 
     let imageTap = UITapGestureRecognizer(target: self, action: #selector(self.copyToClipboard(recognizer:))) 
     imageTap.numberOfTapsRequired = 1 
     imageView.isUserInteractionEnabled = true 
     imageView.addGestureRecognizer(imageTap) 
    } 

    func copyToClipboard(recognizer: UITapGestureRecognizer) { 
     UIPasteboard.general.image = self.resizeImage(image: imageView.image!, newHeight: self.view.bounds.size.height/10) 
    } 

    func resizeImage(image: UIImage, newHeight: CGFloat) -> UIImage { 
     let scale = newHeight/image.size.height 
     let newWidth = image.size.width * scale 
     UIGraphicsBeginImageContext(CGSize(width: newWidth, height: newHeight)) 
     image.draw(in: CGRect(x: 0, y: 0, width: newWidth, height: newHeight)) 
     let newImage = UIGraphicsGetImageFromCurrentImageContext() 
     UIGraphicsEndImageContext() 

     return newImage! 
    } 
} 

ответ

0

Прежде всего, вы говорите:

UIGraphicsBeginImageContext(CGSize(width: newWidth, height: newHeight)) 

Никогда, никогда, никогда не вызов UIGraphicsBeginImageContext. Просто притворись, что этого не существует. Вместо этого всегда вызывайте UIGraphicsBeginImageContextWithOptions. Требуются два дополнительных параметра, которые должны быть всегда равны false и 0. Вещи будут лот лучше, когда вы сделаете это изменение, потому что изображение будет содержать информацию о масштабах, которую вы в настоящее время снимаете.

Другая проблема заключается в том, что вы дважды изменяете один и тот же образ - один раз, чтобы отобразить изображение в представлении изображения, а затем снова измените его размер, когда вы вытащите изображение из изображения и поместите его на картон , Не делай этого! Вместо этого сохраните изображение , без изменения размера. Позже вы можете положить , что на картон - или изменить размер оригинальное изображение, так что вы только изменяете его размер один раз, полностью отделяя изображение от изображения.