CIFilter与UISlider
所以我有一个使用CIFilter改变色调的UISlider。 它疯狂地慢,因为我正在使用uislider时,影响基本的形象。
任何人都有如何更有效地做到这一点的build议?
// UI SLIDER -(IBAction)changeSlider:(id)sender { [self doHueAdjustFilterWithBaseImage:currentSticker.image hueAdjust:[(UISlider *)sender value]]; } //Change HUE -(void)doHueAdjustFilterWithBaseImage:(UIImage*)baseImage hueAdjust:(CGFloat)hueAdjust { CIImage *inputImage = [[CIImage alloc] initWithImage:baseImage]; CIFilter * controlsFilter = [CIFilter filterWithName:@"CIHueAdjust"]; [controlsFilter setValue:inputImage forKey:kCIInputImageKey]; [controlsFilter setValue:[NSNumber numberWithFloat:hueAdjust] forKey:@"inputAngle"]; //NSLog(@"%@",controlsFilter.attributes); CIImage *displayImage = controlsFilter.outputImage; CIContext *context = [CIContext contextWithOptions:nil]; if (displayImage == nil){ NSLog(@"Display NADA"); } else { NSLog(@"RETURN Image"); currentSticker.image = [UIImage imageWithCGImage:[context createCGImage:displayImage fromRect:displayImage.extent]]; } displayImage = nil; inputImage = nil; controlsFilter = nil; }
您可以将UISlider的连续属性设置为NO。 所以你的changeSlider只有在用户释放手指的时候才会被调用。 这是苹果的文档 ?
你在这里的问题是,你不断重新声明的上下文。 将上下文作为一个属性,并在初始化器中初始化一次,然后反复使用,看到巨大的性能提升。
我想宁愿改变你想要的令人敬畏的行为,频繁的更新,而滑动是好的! 这对于用户体验来说是最好的。 所以不要改变这个行为,而是要改变你的algorithm来实现更好的优化。 检查这个以前问的问题,有一些很好的提示。
如何在iOS平台上实现快速图像filter
我会去,不断更新滑块属性,但尝试编码的东西,使得更新时,滑块击中一个数字,这是一个整数小数(有趣的术语,它可能也是错误的)我的意思是检测时滑块通过通过10.000,20.000, 30.000。 只有更新图像而不是更新每个点。 希望这是有道理的。
编辑:
做你的,
input图像和滤波器variables作为iVar。 并检查他们已经分配,然后重复使用,而不是每一次创build。