更改从相机说明

时间:2017-12-07 02:37:29

标签: ios swift image image-processing

我是iOS的新手,拥有其他语言的图像处理编码经验,我希望将其翻译成应用程序,但是我得到了一些我不理解的异常行为。当我将图像转换为数据数组并查看数组中的元素数时,每个新图像都会更改此数字。当我查看数组中的特定数据时,值为0-255,与我对灰度图像的预期相匹配,但我很困惑为什么数据数组中的大小(或元素数)会发生变化。我希望它保持不变,因为我将captureSession设置为640x480。为什么不是这样?即使它不是灰度图像,我也希望尺寸保持不变,不会改变图像。

更新: 我从AV获取uiimage,代码如下所示。未显示的其他代码只是开始会话。我基本上想把图像变成原始像素数据,我已经看到了很多不同的方法来做到这一点,但这似乎是一个很好的方法。 相关守则:

@objc func timerHandle() {
    imageView.image = uiimages
}

func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {
    uiimages = sampleBuffer.image(orientation: .down, scale: 1.0)!
    print(uiimages) //output1
    let data = sampleBuffer.data()
    let newData = Array(data!)
    print(data!.count) //output2
}

extension CMSampleBuffer {
   func image(orientation: UIImageOrientation = .left, scale: CGFloat = 1.0) -> UIImage? {
      if let buffer = CMSampleBufferGetImageBuffer(self) {
          let ciImage = CIImage(cvPixelBuffer: buffer).applyingFilter("CIColorControls", parameters: [kCIInputSaturationKey:0.0])

          return UIImage(ciImage: ciImage, scale: scale, orientation: orientation)
      }
      return nil
   }

   func data(orientation: UIImageOrientation = .left, scale: CGFloat = 1.0) -> Data? {
      if let buffer = CMSampleBufferGetImageBuffer(self) {
          let size = self.image()?.size
          let scale = self.image()?.scale
          let ciImage = CIImage(cvPixelBuffer: buffer).applyingFilter("CIColorControls", parameters: [kCIInputSaturationKey:0.0])
          UIGraphicsBeginImageContextWithOptions(size!, false, scale!)
          defer { UIGraphicsEndImageContext() }
          UIImage(ciImage: ciImage).draw(in: CGRect(origin: .zero, size: size!))
          guard let redraw = UIGraphicsGetImageFromCurrentImageContext() else { return nil }
          return UIImagePNGRepresentation(redraw)
      }
      return nil
   }
}

在output1,当我直接打印uiimage变量时,我得到:

<UIImage: 0x1c40b0ec0>, {640, 480}

显示正确的尺寸 在output2,当我打印计数时,每次调用captureOutput时,我得到一个不同的值:

225726
224474
225961

640x480应该给我307,200,所以为什么我至少得不到常数,即使数值不正确。

0 个答案:

没有答案