毛玻璃

作者: Nicole__Zhang | 来源:发表于2017-06-12 13:42 被阅读30次

    说的高大上一点就是高斯模糊效果,通俗地说,就是毛玻璃效果。

    iOS7

    在iOS7 时系统提供了一个类 UIToolbar 来实现毛玻璃效果。

    iOS8

    在iOS8时苹果又提供了一个新的实现方式 UIBlurEffect,苹果也推荐开发者使用该方式,但是如果你的项目需要支持iOS7就别考虑这一种了。

    使用第三方

    一个对图片模糊化的分类

    先来看看原图

    Snip20170612_10.png

    分别使用三种方法 进行高斯模糊处理

    直接上代码

    - (void)viewDidLoad {
        [super viewDidLoad];
        
        UIImageView *imageView = [[UIImageView alloc] initWithFrame:self.view.bounds];
        imageView.image = [UIImage imageNamed:@"flower.jpg"];
        [self.view addSubview:imageView];
        
        //iOS7
        /*
        typedef NS_ENUM(NSInteger, UIBarStyle) {
            UIBarStyleDefault          = 0,
            UIBarStyleBlack            = 1,
            
            UIBarStyleBlackOpaque      = 1, // Deprecated. Use UIBarStyleBlack
            UIBarStyleBlackTranslucent = 2, // Deprecated. Use UIBarStyleBlack and set the translucent property to YES
        }
         */
        UIToolbar *toolbar = [[UIToolbar alloc] initWithFrame:CGRectMake(0, 0, CGRectGetMaxX(self.view.frame), 200)];
        toolbar.barStyle = UIBarStyleDefault;
        [self.view addSubview:toolbar];
        
        //iOS8
        /*
         typedef NS_ENUM(NSInteger, UIBlurEffectStyle) {
         UIBlurEffectStyleExtraLight,
         UIBlurEffectStyleLight,
         UIBlurEffectStyleDark,
         UIBlurEffectStyleExtraDark __TVOS_AVAILABLE(10_0) __IOS_PROHIBITED __WATCHOS_PROHIBITED,
         UIBlurEffectStyleRegular NS_ENUM_AVAILABLE_IOS(10_0), // Adapts to user interface style
         UIBlurEffectStyleProminent NS_ENUM_AVAILABLE_IOS(10_0), // Adapts to user interface style
         }
         */
        UIBlurEffect *blurEffect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleLight];
        UIVisualEffectView *effectView = [[UIVisualEffectView alloc] initWithEffect:blurEffect];
        effectView.frame = CGRectMake(0, CGRectGetMaxY(self.view.frame) - 500, CGRectGetMaxX(self.view.frame), 200);
        [self.view addSubview:effectView];
    
        //第三方
        UIImage *image = [[UIImage imageNamed:@"bottom"] applyLightEffect];
        UIImageView *imageView2 = [[UIImageView alloc] initWithFrame:CGRectMake(0, CGRectGetMaxY(self.view.frame) - 200, CGRectGetMaxX(self.view.frame), 200)];
        imageView2.image = image;
        [self.view addSubview:imageView2];
    }
    

    上效果图(这里以light 为例)

    Snip20170612_11.png

    还有另外几个枚举效果 有兴趣的可以试试。

    附上第三方
    /*
         File: UIImage+ImageEffects.m
     Abstract: This is a category of UIImage that adds methods to apply blur and tint effects to an image. This is the code you’ll want to look out to find out how to use vImage to efficiently calculate a blur.
      Version: 1.0
     
     Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
     Inc. ("Apple") in consideration of your agreement to the following
     terms, and your use, installation, modification or redistribution of
     this Apple software constitutes acceptance of these terms.  If you do
     not agree with these terms, please do not use, install, modify or
     redistribute this Apple software.
     
     In consideration of your agreement to abide by the following terms, and
     subject to these terms, Apple grants you a personal, non-exclusive
     license, under Apple's copyrights in this original Apple software (the
     "Apple Software"), to use, reproduce, modify and redistribute the Apple
     Software, with or without modifications, in source and/or binary forms;
     provided that if you redistribute the Apple Software in its entirety and
     without modifications, you must retain this notice and the following
     text and disclaimers in all such redistributions of the Apple Software.
     Neither the name, trademarks, service marks or logos of Apple Inc. may
     be used to endorse or promote products derived from the Apple Software
     without specific prior written permission from Apple.  Except as
     expressly stated in this notice, no other rights or licenses, express or
     implied, are granted by Apple herein, including but not limited to any
     patent rights that may be infringed by your derivative works or by other
     works in which the Apple Software may be incorporated.
     
     The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
     MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
     THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
     FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
     OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
     
     IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
     OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION,
     MODIFICATION AND/OR DISTRIBUTION OF THE APPLE SOFTWARE, HOWEVER CAUSED
     AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
     STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
     POSSIBILITY OF SUCH DAMAGE.
     
     Copyright (C) 2013 Apple Inc. All Rights Reserved.
     
     
     Copyright © 2013 Apple Inc. All rights reserved.
     WWDC 2013 License
     
     NOTE: This Apple Software was supplied by Apple as part of a WWDC 2013
     Session. Please refer to the applicable WWDC 2013 Session for further
     information.
     
     IMPORTANT: This Apple software is supplied to you by Apple Inc.
     ("Apple") in consideration of your agreement to the following terms, and
     your use, installation, modification or redistribution of this Apple
     software constitutes acceptance of these terms. If you do not agree with
     these terms, please do not use, install, modify or redistribute this
     Apple software.
     
     In consideration of your agreement to abide by the following terms, and
     subject to these terms, Apple grants you a non-exclusive license, under
     Apple's copyrights in this original Apple software (the "Apple
     Software"), to use, reproduce, modify and redistribute the Apple
     Software, with or without modifications, in source and/or binary forms;
     provided that if you redistribute the Apple Software in its entirety and
     without modifications, you must retain this notice and the following
     text and disclaimers in all such redistributions of the Apple Software.
     Neither the name, trademarks, service marks or logos of Apple Inc. may
     be used to endorse or promote products derived from the Apple Software
     without specific prior written permission from Apple. Except as
     expressly stated in this notice, no other rights or licenses, express or
     implied, are granted by Apple herein, including but not limited to any
     patent rights that may be infringed by your derivative works or by other
     works in which the Apple Software may be incorporated.
     
     The Apple Software is provided by Apple on an "AS IS" basis. APPLE MAKES
     NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE
     IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR
     A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
     OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
     
     IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
     OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION,
     MODIFICATION AND/OR DISTRIBUTION OF THE APPLE SOFTWARE, HOWEVER CAUSED
     AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
     STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
     POSSIBILITY OF SUCH DAMAGE.
     
     EA1002
     5/3/2013
     */
    
    #import "UIImage+ImageEffects.h"
    
    @import Accelerate;
    #import <float.h>
    
    
    @implementation UIImage (ImageEffects)
    
    
    - (UIImage *)applyLightEffect
    {
        UIColor *tintColor = [UIColor colorWithWhite:1.0 alpha:0.3];
        return [self applyBlurWithRadius:30 tintColor:tintColor saturationDeltaFactor:1.8 maskImage:nil];
    }
    
    
    - (UIImage *)applyExtraLightEffect
    {
        UIColor *tintColor = [UIColor colorWithWhite:0.97 alpha:0.82];
        return [self applyBlurWithRadius:20 tintColor:tintColor saturationDeltaFactor:1.8 maskImage:nil];
    }
    
    
    - (UIImage *)applyDarkEffect
    {
        UIColor *tintColor = [UIColor colorWithWhite:0.11 alpha:0.73];
        return [self applyBlurWithRadius:20 tintColor:tintColor saturationDeltaFactor:1.8 maskImage:nil];
    }
    
    
    - (UIImage *)applyTintEffectWithColor:(UIColor *)tintColor
    {
        const CGFloat EffectColorAlpha = 0.6;
        UIColor *effectColor = tintColor;
        int componentCount = CGColorGetNumberOfComponents(tintColor.CGColor);
        if (componentCount == 2) {
            CGFloat b;
            if ([tintColor getWhite:&b alpha:NULL]) {
                effectColor = [UIColor colorWithWhite:b alpha:EffectColorAlpha];
            }
        }
        else {
            CGFloat r, g, b;
            if ([tintColor getRed:&r green:&g blue:&b alpha:NULL]) {
                effectColor = [UIColor colorWithRed:r green:g blue:b alpha:EffectColorAlpha];
            }
        }
        return [self applyBlurWithRadius:10 tintColor:effectColor saturationDeltaFactor:-1.0 maskImage:nil];
    }
    
    
    - (UIImage *)applyBlurWithRadius:(CGFloat)blurRadius tintColor:(UIColor *)tintColor saturationDeltaFactor:(CGFloat)saturationDeltaFactor maskImage:(UIImage *)maskImage
    {
        // Check pre-conditions.
        if (self.size.width < 1 || self.size.height < 1) {
            NSLog (@"*** error: invalid size: (%.2f x %.2f). Both dimensions must be >= 1: %@", self.size.width, self.size.height, self);
            return nil;
        }
        if (!self.CGImage) {
            NSLog (@"*** error: image must be backed by a CGImage: %@", self);
            return nil;
        }
        if (maskImage && !maskImage.CGImage) {
            NSLog (@"*** error: maskImage must be backed by a CGImage: %@", maskImage);
            return nil;
        }
    
        CGRect imageRect = { CGPointZero, self.size };
        UIImage *effectImage = self;
        
        BOOL hasBlur = blurRadius > __FLT_EPSILON__;
        BOOL hasSaturationChange = fabs(saturationDeltaFactor - 1.) > __FLT_EPSILON__;
        if (hasBlur || hasSaturationChange) {
            UIGraphicsBeginImageContextWithOptions(self.size, NO, [[UIScreen mainScreen] scale]);
            CGContextRef effectInContext = UIGraphicsGetCurrentContext();
            CGContextScaleCTM(effectInContext, 1.0, -1.0);
            CGContextTranslateCTM(effectInContext, 0, -self.size.height);
            CGContextDrawImage(effectInContext, imageRect, self.CGImage);
    
            vImage_Buffer effectInBuffer;
            effectInBuffer.data     = CGBitmapContextGetData(effectInContext);
            effectInBuffer.width    = CGBitmapContextGetWidth(effectInContext);
            effectInBuffer.height   = CGBitmapContextGetHeight(effectInContext);
            effectInBuffer.rowBytes = CGBitmapContextGetBytesPerRow(effectInContext);
        
            UIGraphicsBeginImageContextWithOptions(self.size, NO, [[UIScreen mainScreen] scale]);
            CGContextRef effectOutContext = UIGraphicsGetCurrentContext();
            vImage_Buffer effectOutBuffer;
            effectOutBuffer.data     = CGBitmapContextGetData(effectOutContext);
            effectOutBuffer.width    = CGBitmapContextGetWidth(effectOutContext);
            effectOutBuffer.height   = CGBitmapContextGetHeight(effectOutContext);
            effectOutBuffer.rowBytes = CGBitmapContextGetBytesPerRow(effectOutContext);
    
            if (hasBlur) {
                // A description of how to compute the box kernel width from the Gaussian
                // radius (aka standard deviation) appears in the SVG spec:
                // http://www.w3.org/TR/SVG/filters.html#feGaussianBlurElement
                // 
                // For larger values of 's' (s >= 2.0), an approximation can be used: Three
                // successive box-blurs build a piece-wise quadratic convolution kernel, which
                // approximates the Gaussian kernel to within roughly 3%.
                //
                // let d = floor(s * 3*sqrt(2*pi)/4 + 0.5)
                // 
                // ... if d is odd, use three box-blurs of size 'd', centered on the output pixel.
                // 
                CGFloat inputRadius = blurRadius * [[UIScreen mainScreen] scale];
                NSUInteger radius = floor(inputRadius * 3. * sqrt(2 * M_PI) / 4 + 0.5);
                if (radius % 2 != 1) {
                    radius += 1; // force radius to be odd so that the three box-blur methodology works.
                }
                vImageBoxConvolve_ARGB8888(&effectInBuffer, &effectOutBuffer, NULL, 0, 0, radius, radius, 0, kvImageEdgeExtend);
                vImageBoxConvolve_ARGB8888(&effectOutBuffer, &effectInBuffer, NULL, 0, 0, radius, radius, 0, kvImageEdgeExtend);
                vImageBoxConvolve_ARGB8888(&effectInBuffer, &effectOutBuffer, NULL, 0, 0, radius, radius, 0, kvImageEdgeExtend);
            }
            BOOL effectImageBuffersAreSwapped = NO;
            if (hasSaturationChange) {
                CGFloat s = saturationDeltaFactor;
                CGFloat floatingPointSaturationMatrix[] = {
                    0.0722 + 0.9278 * s,  0.0722 - 0.0722 * s,  0.0722 - 0.0722 * s,  0,
                    0.7152 - 0.7152 * s,  0.7152 + 0.2848 * s,  0.7152 - 0.7152 * s,  0,
                    0.2126 - 0.2126 * s,  0.2126 - 0.2126 * s,  0.2126 + 0.7873 * s,  0,
                                      0,                    0,                    0,  1,
                };
                const int32_t divisor = 256;
                NSUInteger matrixSize = sizeof(floatingPointSaturationMatrix)/sizeof(floatingPointSaturationMatrix[0]);
                int16_t saturationMatrix[matrixSize];
                for (NSUInteger i = 0; i < matrixSize; ++i) {
                    saturationMatrix[i] = (int16_t)roundf(floatingPointSaturationMatrix[i] * divisor);
                }
                if (hasBlur) {
                    vImageMatrixMultiply_ARGB8888(&effectOutBuffer, &effectInBuffer, saturationMatrix, divisor, NULL, NULL, kvImageNoFlags);
                    effectImageBuffersAreSwapped = YES;
                }
                else {
                    vImageMatrixMultiply_ARGB8888(&effectInBuffer, &effectOutBuffer, saturationMatrix, divisor, NULL, NULL, kvImageNoFlags);
                }
            }
            if (!effectImageBuffersAreSwapped)
                effectImage = UIGraphicsGetImageFromCurrentImageContext();
            UIGraphicsEndImageContext();
    
            if (effectImageBuffersAreSwapped)
                effectImage = UIGraphicsGetImageFromCurrentImageContext();
            UIGraphicsEndImageContext();
        }
    
        // Set up output context.
        UIGraphicsBeginImageContextWithOptions(self.size, NO, [[UIScreen mainScreen] scale]);
        CGContextRef outputContext = UIGraphicsGetCurrentContext();
        CGContextScaleCTM(outputContext, 1.0, -1.0);
        CGContextTranslateCTM(outputContext, 0, -self.size.height);
    
        // Draw base image.
        CGContextDrawImage(outputContext, imageRect, self.CGImage);
    
        // Draw effect image.
        if (hasBlur) {
            CGContextSaveGState(outputContext);
            if (maskImage) {
                CGContextClipToMask(outputContext, imageRect, maskImage.CGImage);
            }
            CGContextDrawImage(outputContext, imageRect, effectImage.CGImage);
            CGContextRestoreGState(outputContext);
        }
    
        // Add in color tint.
        if (tintColor) {
            CGContextSaveGState(outputContext);
            CGContextSetFillColorWithColor(outputContext, tintColor.CGColor);
            CGContextFillRect(outputContext, imageRect);
            CGContextRestoreGState(outputContext);
        }
    
        // Output image is ready.
        UIImage *outputImage = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
    
        return outputImage;
    }
    
    @end
    
    /*
         File: UIImage+ImageEffects.h
     Abstract: This is a category of UIImage that adds methods to apply blur and tint effects to an image. This is the code you’ll want to look out to find out how to use vImage to efficiently calculate a blur.
      Version: 1.0
     
     Disclaimer: IMPORTANT:  This Apple software is supplied to you by Apple
     Inc. ("Apple") in consideration of your agreement to the following
     terms, and your use, installation, modification or redistribution of
     this Apple software constitutes acceptance of these terms.  If you do
     not agree with these terms, please do not use, install, modify or
     redistribute this Apple software.
     
     In consideration of your agreement to abide by the following terms, and
     subject to these terms, Apple grants you a personal, non-exclusive
     license, under Apple's copyrights in this original Apple software (the
     "Apple Software"), to use, reproduce, modify and redistribute the Apple
     Software, with or without modifications, in source and/or binary forms;
     provided that if you redistribute the Apple Software in its entirety and
     without modifications, you must retain this notice and the following
     text and disclaimers in all such redistributions of the Apple Software.
     Neither the name, trademarks, service marks or logos of Apple Inc. may
     be used to endorse or promote products derived from the Apple Software
     without specific prior written permission from Apple.  Except as
     expressly stated in this notice, no other rights or licenses, express or
     implied, are granted by Apple herein, including but not limited to any
     patent rights that may be infringed by your derivative works or by other
     works in which the Apple Software may be incorporated.
     
     The Apple Software is provided by Apple on an "AS IS" basis.  APPLE
     MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
     THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
     FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
     OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
     
     IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
     OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION,
     MODIFICATION AND/OR DISTRIBUTION OF THE APPLE SOFTWARE, HOWEVER CAUSED
     AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
     STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
     POSSIBILITY OF SUCH DAMAGE.
     
     Copyright (C) 2013 Apple Inc. All Rights Reserved.
     
     
     Copyright © 2013 Apple Inc. All rights reserved.
     WWDC 2013 License
     
     NOTE: This Apple Software was supplied by Apple as part of a WWDC 2013
     Session. Please refer to the applicable WWDC 2013 Session for further
     information.
     
     IMPORTANT: This Apple software is supplied to you by Apple Inc.
     ("Apple") in consideration of your agreement to the following terms, and
     your use, installation, modification or redistribution of this Apple
     software constitutes acceptance of these terms. If you do not agree with
     these terms, please do not use, install, modify or redistribute this
     Apple software.
     
     In consideration of your agreement to abide by the following terms, and
     subject to these terms, Apple grants you a non-exclusive license, under
     Apple's copyrights in this original Apple software (the "Apple
     Software"), to use, reproduce, modify and redistribute the Apple
     Software, with or without modifications, in source and/or binary forms;
     provided that if you redistribute the Apple Software in its entirety and
     without modifications, you must retain this notice and the following
     text and disclaimers in all such redistributions of the Apple Software.
     Neither the name, trademarks, service marks or logos of Apple Inc. may
     be used to endorse or promote products derived from the Apple Software
     without specific prior written permission from Apple. Except as
     expressly stated in this notice, no other rights or licenses, express or
     implied, are granted by Apple herein, including but not limited to any
     patent rights that may be infringed by your derivative works or by other
     works in which the Apple Software may be incorporated.
     
     The Apple Software is provided by Apple on an "AS IS" basis. APPLE MAKES
     NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION THE
     IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS FOR
     A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
     OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
     
     IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
     OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
     SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
     INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION,
     MODIFICATION AND/OR DISTRIBUTION OF THE APPLE SOFTWARE, HOWEVER CAUSED
     AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
     STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
     POSSIBILITY OF SUCH DAMAGE.
     
     EA1002
     5/3/2013
     */
    
    @import UIKit;
    
    @interface UIImage (ImageEffects)
    
    - (UIImage *)applyLightEffect;
    - (UIImage *)applyExtraLightEffect;
    - (UIImage *)applyDarkEffect;
    - (UIImage *)applyTintEffectWithColor:(UIColor *)tintColor;
    
    - (UIImage *)applyBlurWithRadius:(CGFloat)blurRadius tintColor:(UIColor *)tintColor saturationDeltaFactor:(CGFloat)saturationDeltaFactor maskImage:(UIImage *)maskImage;
    
    @end
    
    

    相关文章

      网友评论

          本文标题:毛玻璃

          本文链接:https://www.haomeiwen.com/subject/hdjlqxtx.html