使用gpuimage2

时间:2017-12-01 13:13:21

标签: ios ipad swift3 gpuimage

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

经过一番挖掘后,我找到了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)")
}

这是我的初始设置,然后我将相机Feed放在视图中

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方法的内容(首次运行时图片为零)

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
}

我得到一个白色的屏幕,而不是我的相机,但仍然没有图像。

任何帮助将不胜感激

1 个答案:

答案 0 :(得分:0)

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

基本上它与我的pictureOutput变量的生命周期有关,因为它被封装在一个方法中,并没有足够长的时间来进行回调并保存图像,方法是将pictureOutput变量设置为a类变量我解决了我的问题