当前位置: 首页 > 知识库问答 >
问题:

如何产生类似iOS 7模糊视图的效果?

章远航
2023-03-14

我试图从苹果公开发布的iOS7示例屏幕中复制这个模糊的背景:

这个问题建议对下面的内容应用CI筛选器,但这是一种完全不同的方法。很明显,iOS 7没有捕获以下视图的内容,原因有很多:

  1. 做一些粗略的测试,捕获下面视图的屏幕截图,并应用一个足够大的半径来模拟iOS 7模糊风格的CIGaussianBlur过滤器,即使在模拟器上也需要1-2秒。

任何人都可以假设他们可以使用什么样的框架来产生这种效果,以及是否有可能在当前的公共API中产生类似的效果?

编辑:(来自评论)我们不确切知道苹果是如何做到的,但是我们可以做一些基本的假设吗?我们可以假设他们在使用硬件,对吗?

效果是否在每个视图中都是独立的,以至于效果实际上不知道它背后是什么?或者,必须根据模糊的工作方式,考虑模糊背后的内容?

如果效果背后的内容是相关的,我们是否可以假设苹果正在接收下面内容的“提要”,并不断地以模糊呈现它们?

共有3个答案

邹博明
2023-03-14

事实上,我打赌这将是相当简单的实现。它可能不会运行,或者看起来与苹果的情况完全一样,但可能非常接近。

首先,您需要确定要呈现的UIView的CGRect。一旦你确定了,你只需要抓取用户界面的一部分的图像,这样它就可以模糊了。像这样的东西...

- (UIImage*)getBlurredImage {
    // You will want to calculate this in code based on the view you will be presenting.
    CGSize size = CGSizeMake(200,200);

    UIGraphicsBeginImageContext(size);
    [view drawViewHierarchyInRect:(CGRect){CGPointZero, w, h} afterScreenUpdates:YES]; // view is the view you are grabbing the screen shot of. The view that is to be blurred.
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    // Gaussian Blur
    image = [image applyLightEffect];

    // Box Blur
    // image = [image boxblurImageWithBlur:0.2f];

    return image;
}

使用苹果提供的UIImage-ImageEffects类别,你会得到一个高斯模糊,看起来非常像iOS 7中的模糊。

您还可以使用下面的box BlurImageBackBlur:UIImage类别来使用框模糊。这是基于你可以在这里找到的一个算法。

@implementation UIImage (Blur)

-(UIImage *)boxblurImageWithBlur:(CGFloat)blur {
    if (blur < 0.f || blur > 1.f) {
        blur = 0.5f;
    }
    int boxSize = (int)(blur * 50);
    boxSize = boxSize - (boxSize % 2) + 1;

    CGImageRef img = self.CGImage;

    vImage_Buffer inBuffer, outBuffer;

    vImage_Error error;

    void *pixelBuffer;

    CGDataProviderRef inProvider = CGImageGetDataProvider(img);
    CFDataRef inBitmapData = CGDataProviderCopyData(inProvider);

    inBuffer.width = CGImageGetWidth(img);
    inBuffer.height = CGImageGetHeight(img);
    inBuffer.rowBytes = CGImageGetBytesPerRow(img);

    inBuffer.data = (void*)CFDataGetBytePtr(inBitmapData);

    pixelBuffer = malloc(CGImageGetBytesPerRow(img) * CGImageGetHeight(img));

    if(pixelBuffer == NULL)
        NSLog(@"No pixelbuffer");

    outBuffer.data = pixelBuffer;
    outBuffer.width = CGImageGetWidth(img);
    outBuffer.height = CGImageGetHeight(img);
    outBuffer.rowBytes = CGImageGetBytesPerRow(img);

    error = vImageBoxConvolve_ARGB8888(&inBuffer, &outBuffer, NULL, 0, 0, boxSize, boxSize, NULL, kvImageEdgeExtend);

    if (error) {
        NSLog(@"JFDepthView: error from convolution %ld", error);
    }

    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    CGContextRef ctx = CGBitmapContextCreate(outBuffer.data,
                                         outBuffer.width,
                                         outBuffer.height,
                                         8,
                                         outBuffer.rowBytes,
                                         colorSpace,
                                         kCGImageAlphaNoneSkipLast);
    CGImageRef imageRef = CGBitmapContextCreateImage (ctx);
    UIImage *returnImage = [UIImage imageWithCGImage:imageRef];

    //clean up
    CGContextRelease(ctx);
    CGColorSpaceRelease(colorSpace);

    free(pixelBuffer);
    CFRelease(inBitmapData);

    CGImageRelease(imageRef);

    return returnImage;
}

@end

现在,您正在计算要模糊的屏幕区域,将其传递到模糊类别并接收模糊的UIImage返回,现在剩下的就是将模糊的图像设置为您将呈现的视图的背景。就像我说的,这不会是苹果正在做的事情的完美匹配,但它看起来仍然应该很酷。

希望有帮助。

罗渝
2023-03-14

苹果在WWDC发布了代码,作为UIImage上的一个类别,包括这个功能,如果你有一个开发者账户,你可以通过以下链接获取UIImage类别(和其余的示例代码):https://developer.apple.com/wwdc/schedule/并浏览第226节点击详细信息。我还没有玩过它,但我认为iOS6的效果会慢得多,iOS7有一些增强功能,可以抓取用作模糊输入的初始屏幕截图快了很多。

直接链接:https://developer.apple.com/downloads/download.action?path=wwdc_2013/wwdc_2013_sample_code/ios_uiimageeffects.zip

姜卜霸
2023-03-14

为什么要费心复制这种效果呢?只需在视图后面绘制一个UIToolbar。

myView.backgroundColor = [UIColor clearColor];
UIToolbar* bgToolbar = [[UIToolbar alloc] initWithFrame:myView.frame];
bgToolbar.barStyle = UIBarStyleDefault;
[myView.superview insertSubview:bgToolbar belowSubview:myView];
 类似资料:
  • 除了使用CSS或javascript之外,有没有更本机的解决方案使用Phonegap来创建iOS7模糊效果? 我以前从未使用过Phonegap,我的应用程序需要模糊效果,我正在尝试使用我的网络技能创建此应用程序,或者雇佣本地开发人员。 谢谢大家!

  • 安卓的模糊视图 > 原文链接 : A Blurring View for Android 作者 : Jun Luo 译者 : lvtea0105 校对者: bboyfeiyu 校对者: chaossss 状态 : 校对完成 模糊效果可以生动地表现出内容的层次感,当使用者关注重点内容,即便在模糊表面之下发生视差效果或者动态改变,也能够保持当前背景。 在IOS设备中,我们首先构造一个UIVisualE

  • 问题内容: 我正在尝试在Java游戏中实现模糊机制。如何在运行时创建模糊效果? 问题答案: 请参阅/ Google“卷积滤镜”,这是一种根据周围像素值更改像素值的方法。因此,除了模糊之外,您还可以进行图像锐化和寻线。

  • 注意: Internet Explorer和Safari不支持SVG滤镜! <defs> 和 <filter> 所有互联网的SVG滤镜定义在<defs>元素中。<defs>元素定义短并含有特殊元素(如滤镜)定义。 <filter>标签用来定义SVG滤镜。<filter>标签使用必需的id属性来定义向图形应用哪个滤镜? SVG <feGaussianBlur> 实例 1 <feGaussianBlu

  • 本文向大家介绍iOS图片模糊效果的实现方法,包括了iOS图片模糊效果的实现方法的使用技巧和注意事项,需要的朋友参考一下 本文为大家分享了iOS图片模糊效果的三种实现方式,供大家参考,具体内容如下 1.实现效果依次如图:原图、iOS8效果、Core Image效果、 VImage 效果 - 2. 代码 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊教程。

  • 问题内容: 我想绘制概率图,但是imshow会为概率为零的点生成模糊值。如何摆脱围绕真实网格点的模糊外围? 例: 问题答案: 默认情况下(在mpl 2.0中已更改),对数据进行插值(就像对图像所做的那样)。您需要做的就是告诉它不要插值: 也将为您想要的工作。 doc