0

我正在创建一个图像过滤应用程序,基本上你的图像显示在视图控制器上,底部有几个不同的图像过滤器;单击一个会影响主图像的亮度(例如)。我注意到在更高分辨率的图像上应用过滤器需要更长的时间,所以我想创建一个完成处理程序(这是我第一次做这个完成的事情)并在视图控制器的中心显示“活动指示器视图”来通知它工作的用户......所以下面是改变图像亮度并将 CIImage 发送回视图控制器的函数(在 ImageProcessor.swift 类中):

func setBrightness(ciImage: CIImage, intensity: Float = 0.5, completion: (CIImage) -> CIImage) -> CIImage? {
    let filter = CIFilter(name: "CIColorControls");
    filter?.setValue(ciImage, forKey: kCIInputImageKey);
    filter?.setValue(intensity, forKey: "inputBrightness");
    return completion((filter?.outputImage)!);
}

那么这就是从视图控制器调用它的方式:

    case .Brightness:
        self.loader.startAnimating();
        imgViewFiltered.image = processor.getUIImage(processor.setBrightness(CIImage(image: imgViewFiltered.image!)!, completion: { (let ci) -> CIImage in
            dispatch_async(dispatch_get_main_queue()) {
                self.loader.stopAnimating();
            }
            return ci;
        })!)
        lastUsedFilter = FilterTypes.Brightness;
        appliedFilters.updateValue(0.5, forKey: FilterTypes.Brightness)

问题:

第一:我不知道自从我第一次使用完成处理程序以来我是否正确使用它,所以我会欢迎一些建议。

2:指示灯不显示或停止。该应用程序只是冻结了几秒钟并再次备份,这让我认为完成可能没有在后台完成它的工作。

非常感谢您的时间。

4

1 回答 1

0

终于找到了解决办法。这是通过不使函数返回任何内容并在准备好时使用闭包分配给对象。我想那是在连接 main_que 所以这是修正:

func setBrightness(ciImage: CIImage, intensity: Float = 0.5, completion: (CIImage) -> Void) {
let filter = CIFilter(name: "CIColorControls");
filter?.setValue(ciImage, forKey: kCIInputImageKey);
filter?.setValue(intensity, forKey: "inputBrightness");
completion(filter?.outputImage)!;

}

并调用它并分配图像:

case .Brightness:
    self.loader.startAnimating();
    processor.setBrightness(CIImage(image: imgViewFiltered.image!)!, completion: { (let ci) in
        dispatch_async(dispatch_get_main_queue()) {
            imgViewFiltered.image = UIImage(CIImage: ci);
            self.loader.stopAnimating();
        }
    })!
    lastUsedFilter = FilterTypes.Brightness;
    appliedFilters.updateValue(0.5, forKey: FilterTypes.Brightness)

希望这可以帮助其他面临同样问题的人。

于 2016-03-18T12:57:32.393 回答