35

我正在尝试在 UIImageView 中应用磨砂玻璃效果

我试图实现我在这个问题中发现的内容,但结果是不可接受的。我想要这样的东西:

磨砂玻璃效果

此外,我们可以看到 iOS 7 在很多地方都使用了这种效果。我们如何重现它?

4

4 回答 4

51

关于 CoreImage 的一个很好的教程在这里,展示了如何应用过滤器等等:

http://www.raywenderlich.com/5689/beginning-core-image-in-ios-5

更新 1

因此,经过一些研究,我最终发现,与 OS X 版本的库相比,iOS 的 Core Image 仍然不完整。所以我搜索了很多,我找到了两个解决方案,一个更简单,另一个更广泛和复杂的库。

因此,例如,在几行中我可以得到我想要的结果(其中 originalImage 是应用效果的 UIImage):

GPUImageGaussianBlurFilter *blurFilter = [[GPUImageGaussianBlurFilter alloc] init];
blurFilter.blurSize = 2;
UIImage *blurImage = [blurFilter imageByFilteringImage:resizedImage];

更新 2

在 Apple 发布 iOS 7 之后,一些开发人员找到了一种解决方法,可以与 Apple 在默认 iOS 应用程序中所做的相同,因为 Apple 没有为此提供 API。在我看来,最简单和更好的解决方案就是这个。为什么我认为它是最好的?因为即使它后面的某些视图移动了,模糊仍然可以很好地配合更新后的效果,正如我们所期望的那样。但是,请记住,它依赖于 iOS 7 SDK 才能工作,如果 Apple 更改 UIToolbar 可能会有风险。

更新 3

Apple 提到,在 WWDC 2013(Session 226 - Implementing Engaging UI on iOS)上,他们将在 UIImage 上提供一个名为UIImage+ImageEffects的类别类(我在 Google 上搜索过,并在此处找到,但可在Developer Portal 中找到 - 在搜索框)。使用此类别,您可以使用多种方法(浅色、深色、具有特定颜色等)在静态 UIImage 中应用模糊。另外,昨天我看到了这个组件,发现它非常有趣,因为您可以在框架中应用效果(基于上述类别)。

更新 4

最后,在 iOS 8 上,Apple 发布了可以轻松进行实时模糊的新类。使用UIVisualEffectUIVisualEffectView,您可以快速为您的应用添加实时模糊。这是 Ryan Nystrom 关于如何使用这些类的一个很好的教程(一般来说是模糊的)

于 2012-07-22T15:04:56.310 回答
21

iOS 7 和 8 的解决方案,完全不使用 CoreImage 或 CoreGraphics:

- (void)addBlurToView:(UIView *)view {
    UIView *blurView = nil; 

    if([UIBlurEffect class]) { // iOS 8
        UIBlurEffect *blurEffect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleExtraLight];
        blurView = [[UIVisualEffectView alloc] initWithEffect:blurEffect];
        blurView.frame = view.frame;

    } else { // workaround for iOS 7
        blurView = [[UIToolbar alloc] initWithFrame:view.bounds];
    }

    [blurView setTranslatesAutoresizingMaskIntoConstraints:NO];

    [view addSubview:blurView];
    [view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[blurView]|" options:0 metrics:0 views:NSDictionaryOfVariableBindings(blurView)]];
    [view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[blurView]|" options:0 metrics:0 views:NSDictionaryOfVariableBindings(blurView)]];
}

(假设您不是针对 iOS 7 之前的版本;如果是,则必须在else块中测试 iOS 版本)

此解决方案适用于任何视图,而不仅仅是图像。

于 2014-09-04T15:44:05.477 回答
2

使用 UIImageEffects

如果您在应用模糊时想要更多控制,您可以使用 Apple UIImageEffects(可通过其示例代码获得)。

UIImageEffects 您可以从 Apple 的开发人员库中复制代码:模糊和着色图像

以下是如何使用它:

#import "UIImageEffects.h"
...

self.yourImageView.image = [UIImageEffects imageByApplyingLightEffectToImage:[UIImage imageNamed:@"yourImage.png"]];
于 2016-02-08T01:03:30.973 回答
1

查看Core Image Programming Guide。看起来风格化过滤器模糊过滤器可能适合您的需求。我以前从未使用过 Core Image,但我认为可能会有一些很好的 WWDC 会议涉及它们。该文档在此处有一段基本的示例代码

于 2012-07-22T14:50:24.903 回答