zoukankan      html  css  js  c++  java
  • iOS 毛玻璃效果

    当用户点击按钮后,让整个屏幕产生毛玻璃效果,模糊背景,在此基础上显示一些View,提示用户操作成功!

    在iOS开发中,可以给整个屏幕截个图,通过一定的算法对这张图片进行模糊,显示在一个蒙板上,并在这个蒙板上添加想要的UI效果

    核心代码如下:

      1 /*** 添加蒙版 ***/
      2 - (void)addLayer{
      3 // 截屏,并添加毛玻璃效果
      4     UIGraphicsBeginImageContext(CGSizeMake(kScreenW, kScreenH));
      5     [self.view.window.layer renderInContext:UIGraphicsGetCurrentContext()];
      6     UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
      7     UIGraphicsEndImageContext();
      8     UIImage *image = [UIImage blurryImage:viewImage withBlurLevel:0.15];
      9 //添加的蒙层
     10     UIWindow *keyWindow = [[UIWindow alloc]initWithFrame:[UIScreen mainScreen].bounds];
     11     [keyWindow setWindowLevel:UIWindowLevelAlert];
     12     [keyWindow setBackgroundColor:[[UIColor whiteColor] colorWithAlphaComponent:0.8]];
     13     [keyWindow makeKeyAndVisible];
     14     self.pwdWindow = keyWindow;
     15 
     16 //将模糊后的image设置到UIImageView上展示,并可以在UIWindow上添加其他的控件
     17     UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, kScreenW , kScreenH)];
     18     imageView.image = image;
     19     imageView.userInteractionEnabled = YES;
     20     [self.pwdWindow addSubview:imageView];
     21 }
     22 /**
     23  * 把截屏照片传进去,进行模糊
     24  * 该方法可以作为UIImageView的分类
     25  **/
     26 + (UIImage *)blurryImage:(UIImage *)image withBlurLevel:(CGFloat)blur {
     27     //模糊度,
     28     if ((blur < 0.1f) || (blur > 2.0f)) {
     29         blur = 0.5f;
     30     }
     31 
     32     //boxSize必须大于0
     33     int boxSize = (int)(blur * 100);
     34     boxSize -= (boxSize % 2) + 1;
     35     NSLog(@"boxSize:%i",boxSize);
     36     //图像处理
     37     CGImageRef img = image.CGImage;
     38     //需要引入
     39     /*
     40      This document describes the Accelerate Framework, which contains C APIs for vector and matrix math, digital signal processing, large number handling, and image processing.
     41      本文档介绍了Accelerate Framework,其中包含C语言应用程序接口(API)的向量和矩阵数学,数字信号处理,大量处理和图像处理。
     42      */
     43 
     44     //图像缓存,输入缓存,输出缓存
     45     vImage_Buffer inBuffer, outBuffer;
     46     vImage_Error error;
     47     //像素缓存
     48     void *pixelBuffer;
     49     //数据源提供者,Defines an opaque type that supplies Quartz with data.
     50     CGDataProviderRef inProvider = CGImageGetDataProvider(img);
     51     // provider’s data.
     52     CFDataRef inBitmapData = CGDataProviderCopyData(inProvider);
     53     //宽,高,字节/行,data
     54     inBuffer.width = CGImageGetWidth(img);
     55     inBuffer.height = CGImageGetHeight(img);
     56     inBuffer.rowBytes = CGImageGetBytesPerRow(img);
     57     inBuffer.data = (void*)CFDataGetBytePtr(inBitmapData);
     58     //像数缓存,字节行*图片高
     59     pixelBuffer = malloc(CGImageGetBytesPerRow(img) * CGImageGetHeight(img));
     60     outBuffer.data = pixelBuffer;
     61     outBuffer.width = CGImageGetWidth(img);
     62     outBuffer.height = CGImageGetHeight(img);
     63     outBuffer.rowBytes = CGImageGetBytesPerRow(img);
     64     // 第三个中间的缓存区,抗锯齿的效果
     65     void *pixelBuffer2 = malloc(CGImageGetBytesPerRow(img) * CGImageGetHeight(img));
     66     vImage_Buffer outBuffer2;
     67     outBuffer2.data = pixelBuffer2;
     68     outBuffer2.width = CGImageGetWidth(img);
     69     outBuffer2.height = CGImageGetHeight(img);
     70     outBuffer2.rowBytes = CGImageGetBytesPerRow(img);
     71 
     72     //Convolves a region of interest within an ARGB8888 source image by an implicit M x N kernel that has the effect of a box filter.
     73     error = vImageBoxConvolve_ARGB8888(&inBuffer, &outBuffer2, NULL, 0, 0, boxSize, boxSize, NULL, kvImageEdgeExtend);
     74     //    error = vImageBoxConvolve_ARGB8888(&outBuffer2, &inBuffer, NULL, 0, 0, boxSize, boxSize, NULL, kvImageEdgeExtend);
     75     error = vImageBoxConvolve_ARGB8888(&inBuffer, &outBuffer, NULL, 0, 0, boxSize, boxSize, NULL, kvImageEdgeExtend);
     76     if (error) {
     77         NSLog(@"error from convolution %ld", error);
     78     }
     79     //    NSLog(@"字节组成部分:%zu",CGImageGetBitsPerComponent(img));
     80     //颜色空间DeviceRGB
     81     CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
     82     //用图片创建上下文,CGImageGetBitsPerComponent(img),7,8
     83     CGContextRef ctx = CGBitmapContextCreate(
     84                                              outBuffer.data,
     85                                              outBuffer.width,
     86                                              outBuffer.height,
     87                                              8,
     88                                              outBuffer.rowBytes,
     89                                              colorSpace,
     90                                              CGImageGetBitmapInfo(image.CGImage));
     91     //根据上下文,处理过的图片,重新组件
     92     CGImageRef imageRef = CGBitmapContextCreateImage (ctx);
     93     UIImage *returnImage = [UIImage imageWithCGImage:imageRef];
     94     //clean up
     95     CGContextRelease(ctx);
     96     CGColorSpaceRelease(colorSpace);
     97     free(pixelBuffer);
     98     free(pixelBuffer2);
     99     CFRelease(inBitmapData);
    100     CGColorSpaceRelease(colorSpace);
    101     CGImageRelease(imageRef);
    102     return returnImage;
    103 }

    效果图:

  • 相关阅读:
    【转载】数据杂谈
    【转载】行走在网格之间:微博用户关系模型
    【转载】TalkingData首席金融行业专家鲍忠铁:18亿数据解读移动互联网
    【转载】大数据架构和模式
    【转载】Deep Learning(深度学习)学习笔记整理
    【转载】如何组建一支优秀的数据分析团队?
    【转载】Hadoop可视化分析利器之Hue
    【转载】关于烂代码的那些事
    【转载】6个用好大数据的秘诀
    【转载】如何一步步从数据产品菜鸟走到骨干数据产品
  • 原文地址:https://www.cnblogs.com/caofutao/p/4830444.html
Copyright © 2011-2022 走看看