Захват изображения с фильтром GPUImage на Swift

Я использую GPUImage Framework для фильтров изображений.

Я применил ToonFilter() к камере для эффекта мультяшного фильтра.

Моя проблема заключается в захвате изображения на камеру с эффектом ToonFilter с помощью GPUImage.

Ниже приведен код для отображения ToonFilter с камерой GPUImage и захвата нового изображения с тем же эффектом.

Пожалуйста, подскажите, как я могу сделать снимок с тем же фильтром?

Примечание. Я успешно могу открыть камеру с эффектом ToonFilter — проблема возникает только при захвате нового изображения с эффектом фильтра.

Код:

import UIKit
import GPUImage
import AVFoundation

class SelfieFilterVC: UIViewController, UISplitViewControllerDelegate  {

    @IBOutlet var filterSlider: UISlider?
    @IBOutlet var filterView: RenderView?

    let videoCamera:Camera?
    var blendImage:PictureInput?

    override func viewDidLoad() {

        super.viewDidLoad()

        self.filterOperation = FilterOperation(
            filter:{ToonFilter()},
            listName:"Toon",
            titleName:"Toon",
            sliderConfiguration:.disabled,
            sliderUpdateCallback: nil,
            filterOperationType:.singleInput
        )

        self.configureView()
    }

    required init(coder aDecoder: NSCoder)
    {
        do {
            videoCamera = try Camera(sessionPreset:AVCaptureSessionPreset640x480, location:.backFacing)
            videoCamera!.runBenchmark = true

        } catch {
            videoCamera = nil
            print("Couldn't initialize camera with error: \(error)")
        }

        super.init(coder: aDecoder)!
    }

    var filterOperation: FilterOperationInterface?


    @IBAction func btnCapture(_ sender: Any) {

        videoCamera?.startCapture()

        let pictureOutput = PictureOutput()
        pictureOutput.encodedImageFormat = .jpeg
        pictureOutput.encodedImageAvailableCallback = {imageData in

            if imageData != nil {
                let captureDetailVC = self.storyboard?.instantiateViewController(withIdentifier: "CaptureDetailVC") as! CaptureDetailVC
                captureDetailVC.aCaptureSelectedData = imageData
                self.show(captureDetailVC, sender: true)
            }
        }
    }

    @IBAction func btnBackAction(_ sender: Any) {
        self.dismiss(animated: true, completion: nil)
    }
    func configureView() {

        guard let videoCamera = videoCamera else {

            let errorAlertController = UIAlertController(title: NSLocalizedString("Error", comment: "Error"), message: "Couldn't initialize camera", preferredStyle: .alert)
            errorAlertController.addAction(UIAlertAction(title: NSLocalizedString("OK", comment: "OK"), style: .default, handler: nil))
            self.present(errorAlertController, animated: true, completion: nil)
            return
        }

        if let currentFilterConfiguration = self.filterOperation {
            self.title = currentFilterConfiguration.titleName

            // Configure the filter chain, ending with the view
            if let view = self.filterView {
                switch currentFilterConfiguration.filterOperationType {
                case .singleInput:
                    videoCamera.addTarget(currentFilterConfiguration.filter)
                    currentFilterConfiguration.filter.addTarget(view)
                case .blend:
                    videoCamera.addTarget(currentFilterConfiguration.filter)
                    self.blendImage = PictureInput(imageName:blendImageName)
                    self.blendImage?.addTarget(currentFilterConfiguration.filter)
                    self.blendImage?.processImage()
                    currentFilterConfiguration.filter.addTarget(view)
                case let .custom(filterSetupFunction:setupFunction):
                    currentFilterConfiguration.configureCustomFilter(setupFunction(videoCamera, currentFilterConfiguration.filter, view))
                }

                videoCamera.startCapture()
            }

            // Hide or display the slider, based on whether the filter needs it
            if let slider = self.filterSlider {
                switch currentFilterConfiguration.sliderConfiguration {
                case .disabled:
                    slider.isHidden = true
                //                case let .Enabled(minimumValue, initialValue, maximumValue, filterSliderCallback):
                case let .enabled(minimumValue, maximumValue, initialValue):
                    slider.minimumValue = minimumValue
                    slider.maximumValue = maximumValue
                    slider.value = initialValue
                    slider.isHidden = false
                    self.updateSliderValue()
                }
            }

        }
    }

    @IBAction func updateSliderValue() {
        if let currentFilterConfiguration = self.filterOperation {
            switch (currentFilterConfiguration.sliderConfiguration) {
            case .enabled(_, _, _): currentFilterConfiguration.updateBasedOnSliderValue(Float(self.filterSlider!.value))
            case .disabled: break
            }
        }
    }



    override func viewWillDisappear(_ animated: Bool) {
        if let videoCamera = videoCamera {
            videoCamera.stopCapture()
            videoCamera.removeAllTargets()
            blendImage?.removeAllTargets()
        }

        super.viewWillDisappear(animated)
    }
}

person Akash Thakkar    schedule 10.06.2017    source источник
comment
Вы нашли что-нибудь по этому поводу?   -  person Nikhil Manapure    schedule 28.06.2017


Ответы (1)


Захват изображения с помощью GPUImage осуществляется с помощью метода imageFromCurrentFramebuffer, который вы можете использовать в своем фильтре.

Он возвращает UIImage, который вы можете позже преобразовать в любой формат изображения, который вам нужен, и сохранить его.

let image:UIImage = filter.imageFromCurrentFramebuffer()
if let data = UIImageJPEGRepresentation(image, 0.8) {
    let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
    let filename = documentsDirectory.appendingPathComponent("image.jpg")
    try? data.write(to: filename)
}
person Jan    schedule 20.04.2018