使用 gpuimage2 从相机捕获静止图像

Capturing still image from camera using gpuimage2

我有一个 photo/gif 应用程序,我以前使用 AVFoundation 作为相机和拍照的基础制作的,但我想升级它以添加一些实时过滤和 post 捕获过滤。

经过一些挖掘我发现 gpuimage/gpuimage2 并且因为我的项目在 swift 3 我开始用 gpuimage 替换我以前的相机模块。

我让相机重新工作,但我在从相机拍摄照片以将其存储为 uiimage 直到将其上传到服务器时遇到问题。

do {
  self.videoCamera = try Camera(sessionPreset: AVCaptureSessionPresetPhoto, location: .frontFacing)
} catch {
  self.videoCamera = nil
  print("Couldn't initialize camera with error: \(error)")
}

这是我的初始化,然后这是我在视图中放置相机源的地方

self.filterView!.frame = self.view.frame
self.filterView!.orientation = .portraitUpsideDown
self.filterView!.fillMode = .preserveAspectRatioAndFill
self.videoCamera! --> self.filterView!
self.videoCamera!.startCapture()

如你所见,目前我不想使用任何滤镜,我试图首先恢复基本功能(即显示相机连续拍摄 1-5 张图像)

我注意到有一个 saveNextFrameToURL,但它会将文件保存在设备上,但我只想要 uiimage,所以这就是我用来替换我的 takePhoto 方法的内容(第一个图像为 nil 运行 )

func takePhoto(){
  if self.images == nil {
    self.images = []
  }
  let pictureOutput = PictureOutput()
  pictureOutput.encodedImageFormat = .jpeg
  pictureOutput.imageAvailableCallback = {image in
    self.images!.append(image)
  }
  self.videoCamera! --> pictureOutput
}

我的问题是 imageAvailableCallback 从未被调用(我尝试在其中放置一个断点,但什么也没有),而它通过了方法的其余部分,没有引发任何错误或警告。

我做错了什么?甚至可以从非过滤视图中捕获静止图像吗?如果是这样,我如何添加一个不会改变图像的滤镜,这样我仍然可以在我的应用程序中拍摄一些未经编辑的照片?

我已经研究了 2 个多星期了,每次我搜索是否有人有同样的问题时,我只会发现有关编辑静止图像或过滤图像的问题,以及当我尝试这样过滤图像时:

self.filterView!.frame = self.view.frame
self.filterView!.orientation = .portraitUpsideDown
self.filterView!.fillMode = .preserveAspectRatioAndFill
self.baseFilter = BrightnessAdjustment()
self.videoCamera! --> self.baseFilter --> self.filterView!
self.videoCamera!.startCapture()

和 takePhoto 方法

func takePhoto(){
  if self.images == nil {
    self.images = []
  }
  let pictureOutput = PictureOutput()
  pictureOutput.encodedImageFormat = .jpeg
  pictureOutput.imageAvailableCallback = {image in
    self.images!.append(image)
  }
  self.baseFilter! --> pictureOutput
}

我得到的是白屏,而不是我的相机画面,但仍然没有图像。

任何帮助将不胜感激谢谢

我通过查看类似的问题和评论找到了我的问题所在(找到 Brad Larson 评论的问题 here

基本上它与我的 pictureOutput 变量的生命周期有关,因为它包含在一个方法中,持续时间不足以进行回调和保存图像,方法是使我的 pictureOutput 变量成为class 变量我解决了我的问题