6

所以我有一个 UISlider 正在使用 CIFilter 更改 HUE。它非常慢,因为我在使用 uislider 时影响了基本图像。

有人对如何更有效地做到这一点有建议吗?

 // 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;

}
4

3 回答 3

3

您可以将 UISlider 的连续属性设置为 NO。这样您的 changeSlider 只会在用户松开手指时被调用。这是Apple的文档

于 2012-06-17T01:37:29.013 回答
2

您的问题是您不断重新声明上下文。将上下文作为属性并在初始化程序中初始化一次,然后一遍又一遍地使用它并看到巨大的性能提升。

于 2013-01-29T21:36:05.673 回答
1

我想宁可改变你想要的令人敬畏的行为,滑动时频繁更新是好的!它最适合用户体验。所以不要改变这种行为,而要研究你的算法以实现更大的优化。检查这个先前提出的问题,其中有一些很好的提示。

如何在 iOS 平台上实现快速图像过滤器


我的做法是,继续更新滑块属性,但尝试编写一些代码,当滑块碰到一个整数时进行更新(有趣的术语,它也可能是错误的)我的意思是检测滑块何时通过 10.000、20.000, 30.000。然后才更新图像,而不是更新每个点。希望这是有道理的。

编辑:

做你的,

输入法师和过滤器变量为 iVar。并检查它们是否已经被分配然后重用它而不是每次都创建。

于 2012-06-17T01:48:54.903 回答