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 }

    效果图:

  • 相关阅读:
    CodeForces 681D Gifts by the List (树上DFS)
    UVa 12342 Tax Calculator (水题,纳税)
    CodeForces 681C Heap Operations (模拟题,优先队列)
    CodeForces 682C Alyona and the Tree (树上DFS)
    CodeForces 682B Alyona and Mex (题意水题)
    CodeForces 682A Alyona and Numbers (水题,数学)
    Virtualizing memory type
    页面跳转
    PHP Misc. 函数
    PHP 5 Math 函数
  • 原文地址:https://www.cnblogs.com/caofutao/p/4830444.html
Copyright © 2011-2022 走看看