使用动画从相机中删除滤镜(GPUImage)

时间:2013-10-02 22:37:08

标签: iphone ios objective-c cocoa-touch gpuimage

嗨,Stackoverflow的家伙们!

我的代码中需要您的帮助。我写了一个小应用程序,实时模糊了相机。

为此,我使用了Brad Larson的<{3}}框架(感谢Brad Larson)

现在我想通过动画从相机中删除模糊。此动画的持续时间应为 2 秒。所以我设置了我的代码,以便从我的相机中删除过滤器,如下所示:

-(IBAction)BtnPressed:(id)sender {
    [UIView animateWithDuration: 2
                     animations:^{
                         [(GPUImageTiltShiftFilter *)filter setBlurSize:0.0];
                     }];
}

据我所知,代码应该可行。但是,我运行应用程序并按下按钮,但过滤器未在两个秒内删除。

它被删除超过一秒,这意味着上面的代码不起作用。 我尝试用一​​些代码来改变动态的alpha,如下所示:

-(IBAction)BtnPressed:(id)sender {
    [UIView animateWithDuration: 2
                     animations:^{
                        fstBtn.alpha = 0.0;
                     }];
}

此代码非常良好,持续时间两次秒。我不能看到解决方案。我真的很感激你的帮助

提前致谢,

诺亚

1 个答案:

答案 0 :(得分:2)

[UIView animateWithDuration...]的区别在于UIView要求动画CoreAnimation的属性,内部使用GPUImage

UIView过滤器不是UIView,因此您无法使用GPUImage动画机制为其任何属性设置动画。

为了设置NSTimer过滤器的“unblurring”动画,我建议您创建重复blurSize并在计时器的每个“tick”上,降低过滤器属性(0 case)一点直到- (void)blurIn { if (_bluringTimer) { NSLog(@"WARNING: already blurring"); return; } // Blur filter is not yet active if ([[self.blurFilter targets] count] == 0) { self.blurFilter.blurSize = 0.0f; // Add blur filter to the output [self.activeFilter removeTarget:self.gpuImageView]; [self.activeFilter addTarget:self.blurFilter]; [self.blurFilter addTarget:self.gpuImageView]; } // Start timer // Blur animation is faked using timer and in(/de)credementing the filter size _bluringTimer = [NSTimer timerWithTimeInterval:0.1 target:self selector:@selector(blurTimerStep:) userInfo:@(YES) repeats:YES]; [[NSRunLoop mainRunLoop] addTimer:_bluringTimer forMode:NSRunLoopCommonModes]; NSLog(@"Blur start"); } - (void)blurOut { if (_bluringTimer) { NSLog(@"WARNING: already blurring"); return; } _bluringTimer = [NSTimer timerWithTimeInterval:0.05 target:self selector:@selector(blurTimerStep:) userInfo:@(NO) repeats:YES]; [[NSRunLoop mainRunLoop] addTimer:_bluringTimer forMode:NSRunLoopCommonModes]; } /** One step of blurring timer. This method takes care of incrementing / decrementing blur size of blur filter @param timer Timer calling this method */ - (void)blurTimerStep:(NSTimer *)timer { static NSInteger Step; BOOL blurringIn = [[timer userInfo] boolValue]; // Blurring settings static NSTimeInterval BlurringDuration = 0.4; static CGFloat MaxBlur = 3.0f; CGFloat bluringStepsCount = BlurringDuration / timer.timeInterval; CGFloat blurSizeStep = MaxBlur/bluringStepsCount; // Make step in blurring self.blurFilter.blurSize += (blurringIn ? blurSizeStep : -blurSizeStep); Step++; if (Step > bluringStepsCount) { [_bluringTimer invalidate]; _bluringTimer = nil; Step = 0; // If blurring out, when its done, remove the blur filter from the filters chain if (!blurringIn) { // Reset filters chain (remove blur) [self.activeFilter removeTarget:self.blurFilter]; [self.blurFilter removeAllTargets]; [self.activeFilter addTarget:self.gpuImageView]; self.blurFilter = nil; NSLog(@"Blur filter removed"); } } } 。一旦它为零,使计时器无效,从摄像机中删除滤波器,也可以从所有变量中取出,并将其解除分配。

我使用这种方法并且工作正常。


你可以看看我的动画方法。我正在使用这两种工作正常。它们已经足够评论了,但请不要指望我一步一步地解释代码,因为它需要花费很多时间

{{1}}