1

Stackoverflow の皆さん!

私のコード内であなたの助けが必要です。カメラをリアルタイムでぼかす小さなアプリケーションを書きました。

このために、Brad Larson のGPUImageフレームワークを使用しました(Brad Larson に感謝) !

次に、アニメーションでカメラからぼかしを取り除きたいと思います。このアニメーションの長さは2秒です。そこで、次のようにカメラからフィルターを削除するようにコードを設定しました。

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

私の知る限り、コードは機能するはずです。しかし、アプリケーションを実行してボタンを押したのですが、2秒以内にフィルターが削除されませんでした。

1 秒もかからずに削除されました。つまり、上記のコードは機能しませんalpha次のように、アニメーションでを変更するコードをいくつか入れようとしました。

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

このコードは、2秒間で非常にうまく機能しました。これに対する解決策がわかりません。大変 お世話 に なります.

前もって感謝します、

ノア

4

1 に答える 1

2

違いは、内部で を使用してアニメーション化する のプロパティを[UIView animateWithDuration...]呼び出すことです。UIViewCoreAnimation

GPUImageフィルターは ではないため、アニメーション メカニズムUIViewを使用してそのプロパティをアニメーション化することはできません。UIView

フィルターの「ぼかし」をアニメーション化するために、繰り返しを作成し、タイマーの各「ティック」で、フィルターのプロパティ(あなたの場合)を少し下げるGPUImageことをお勧めします。ゼロになったら、タイマーを無効にし、カメラからフィルターを削除し、おそらくすべての変数からフィルターを削除して、ロックを解除します。NSTimerblurSize0

私はこのアプローチを使用しており、正常に動作します。


私のアニメーション方法をご覧ください。私はそれらの両方を使用していますが、うまく機能しています。それらは十分にコメントされていますが、コードの段階的な説明は時間がかかるので期待しないでください。

- (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");
        }
    }
}
于 2013-10-03T12:43:23.313 に答える