gpt4 book ai didi

iphone - 使用动画从相机中移除滤镜 (GPUImage)

转载 作者:行者123 更新时间:2023-11-29 10:54:11 26 4
gpt4 key购买 nike

大家好,Stackoverflow!

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

为此我使用了 GPUImage来自 Brad Larson 的框架(感谢 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;
}];
}

此代码在 秒的持续时间内运行得非常。我无法看到对此的解决方案。非常感谢您的帮助

提前致谢

诺亚

最佳答案

不同之处在于 [UIView animateWithDuration...] 是调用动画 UIView 的属性,在内部使用 CoreAnimation

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

为了使 GPUImage 滤镜的动画“不模糊”,我建议您创建重复的 NSTimer 并在计时器的每个“滴答声”上,降低滤镜属性(blurSize 在你的情况下)一点点直到它是 0。一旦它为零,使计时器无效,从相机中移除滤镜,也许从所有变量中移除滤镜,并让它解除分配。

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


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

- (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");
}
}
}

关于iphone - 使用动画从相机中移除滤镜 (GPUImage),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19147949/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com