使用 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 变量我解决了我的问题
我有一个 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 变量我解决了我的问题