簡體   English   中英

使用Swift上的GPUImage過濾器捕獲圖像

[英]Capture image with GPUImage filter on Swift

我正在使用GPUImage Framework for Image過濾器。

我在相機上應用了ToonFilter()來實現卡通濾鏡效果。

我的問題是使用GPUImage在ToonFilter效果的相機上捕獲圖像。

下面是使用GPUImage相機顯示ToonFilter並捕獲具有相同效果的新圖像的代碼。

請指導我如何使用相同的過濾器捕獲圖像?

注意:我成功地能夠使用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)
    }
}

使用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)
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM