2017-06-12 116 views
0

我试图旋转CMSampleBuffer(来自相机)的像素数据并将其显示在UIImageView中。我不想旋转视图本身。它必须是实际的像素数据。使用CIFilter围绕中心旋转CIImage

我抓住feed,将其转换为CIImage,并用CIFilter旋转它。 我在设置它必须旋转的点时遇到了问题。 现在它围绕左下角旋转。我想旋转它的中心。

func captureOutput(_ captureOutput: AVCaptureOutput!, didOutputSampleBuffer sampleBuffer: CMSampleBuffer!, from connection: AVCaptureConnection!) { 

      //create pixelbuffer 

      let pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer)! 
      let context = CIContext.init(options: nil) 

      // calculating the radians to rotate the ciimage by 
      let radians : Float = atan2f(Float(boxView!.transform.b), Float(boxView!.transform.a)); 
      //create ciimage from the pixelbuffer 

      let options = [kCVPixelBufferCGImageCompatibilityKey as String: true, 
       kCVPixelBufferCGBitmapContextCompatibilityKey as String: true,] 
      let ci = CIImage.init(cvPixelBuffer: pixelBuffer, options: options) 
      //transform filter 
      let filter = CIFilter.init(name: "CIAffineTransform") 
      //set translation point to center 
      var transform = CGAffineTransform(translationX: self.view.frame.midX, y: self.view.frame.midY) 
      //rotate 
      transform = CGAffineTransform(rotationAngle:CGFloat(radians)) 
      // set translation point back again to normal 
      var transformBack = CGAffineTransform(translationX: -self.view.frame.midX, y: -self.view.frame.midY) 
      //applying the transform 
      transform.concatenating(transformBack) 

      filter!.setValue(transform, forKey: kCIInputTransformKey) 
      filter!.setValue(ci, forKey: kCIInputImageKey) 
      let output = filter?.outputImage 
      let img = context.createCGImage(output!, from: imageView!.frame) 
      // send image to be displayed 
      self.imageView!.image = UIImage(cgImage: img!) 

} 

回答

1

找到了。我必须将转换应用于转换变量本身。

let transform = CGAffineTransform(translationX: self.view.frame.midX, y: self.view.frame.midY).rotate(angle: CGFloat(radians)).translatedBy(x: -self.view.frame.midX, y: -self.view.frame.midY)