我是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,所以为什么我至少得不到常数,即使数值不正确。