zoukankan      html  css  js  c++  java
  • iOS7 毛玻璃效果实现

    首先看效果:

         


    核心代码:

    1. //加模糊效果,image是图片,blur是模糊度  
    2. - (UIImage *)blurryImage:(UIImage *)image withBlurLevel:(CGFloat)blur {  
    3.     //模糊度,  
    4.     if ((blur < 0.1f) || (blur > 2.0f)) {  
    5.         blur = 0.5f;  
    6.     }  
    7.       
    8.     //boxSize必须大于0  
    9.     int boxSize = (int)(blur * 100);  
    10.     boxSize -= (boxSize % 2) + 1;  
    11.     NSLog(@"boxSize:%i",boxSize);  
    12.     //图像处理  
    13.     CGImageRef img = image.CGImage;  
    14.     //需要引入#import <Accelerate/Accelerate.h>  
    15.     /* 
    16.      This document describes the Accelerate Framework, which contains C APIs for vector and matrix math, digital signal processing, large number handling, and image processing. 
    17.      本文档介绍了Accelerate Framework,其中包含C语言应用程序接口(API)的向量和矩阵数学,数字信号处理,大量处理和图像处理。 
    18.      */  
    19.       
    20.     //图像缓存,输入缓存,输出缓存  
    21.     vImage_Buffer inBuffer, outBuffer;  
    22.     vImage_Error error;  
    23.     //像素缓存  
    24.     void *pixelBuffer;  
    25.       
    26.     //数据源提供者,Defines an opaque type that supplies Quartz with data.  
    27.     CGDataProviderRef inProvider = CGImageGetDataProvider(img);  
    28.     // provider’s data.  
    29.     CFDataRef inBitmapData = CGDataProviderCopyData(inProvider);  
    30.       
    31.     //宽,高,字节/行,data  
    32.     inBuffer.width = CGImageGetWidth(img);  
    33.     inBuffer.height = CGImageGetHeight(img);  
    34.     inBuffer.rowBytes = CGImageGetBytesPerRow(img);  
    35.     inBuffer.data = (void*)CFDataGetBytePtr(inBitmapData);  
    36.       
    37.     //像数缓存,字节行*图片高  
    38.     pixelBuffer = malloc(CGImageGetBytesPerRow(img) * CGImageGetHeight(img));  
    39.       
    40.     outBuffer.data = pixelBuffer;  
    41.     outBuffer.width = CGImageGetWidth(img);  
    42.     outBuffer.height = CGImageGetHeight(img);  
    43.     outBuffer.rowBytes = CGImageGetBytesPerRow(img);  
    44.       
    45.       
    46.     // 第三个中间的缓存区,抗锯齿的效果  
    47.     void *pixelBuffer2 = malloc(CGImageGetBytesPerRow(img) * CGImageGetHeight(img));  
    48.     vImage_Buffer outBuffer2;  
    49.     outBuffer2.data = pixelBuffer2;  
    50.     outBuffer2.width = CGImageGetWidth(img);  
    51.     outBuffer2.height = CGImageGetHeight(img);  
    52.     outBuffer2.rowBytes = CGImageGetBytesPerRow(img);  
    53.       
    54.     //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.  
    55.     error = vImageBoxConvolve_ARGB8888(&inBuffer, &outBuffer2, NULL, 0, 0, boxSize, boxSize, NULL, kvImageEdgeExtend);  
    56.     error = vImageBoxConvolve_ARGB8888(&outBuffer2, &inBuffer, NULL, 0, 0, boxSize, boxSize, NULL, kvImageEdgeExtend);  
    57.     error = vImageBoxConvolve_ARGB8888(&inBuffer, &outBuffer, NULL, 0, 0, boxSize, boxSize, NULL, kvImageEdgeExtend);  
    58.       
    59.       
    60.     if (error) {  
    61.         NSLog(@"error from convolution %ld", error);  
    62.     }  
    63.       
    64. //    NSLog(@"字节组成部分:%zu",CGImageGetBitsPerComponent(img));  
    65.     //颜色空间DeviceRGB  
    66.     CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();  
    67.     //用图片创建上下文,CGImageGetBitsPerComponent(img),7,8  
    68.     CGContextRef ctx = CGBitmapContextCreate(  
    69.                                              outBuffer.data,  
    70.                                              outBuffer.width,  
    71.                                              outBuffer.height,  
    72.                                              8,  
    73.                                              outBuffer.rowBytes,  
    74.                                              colorSpace,  
    75.                                              CGImageGetBitmapInfo(image.CGImage));  
    76.       
    77.     //根据上下文,处理过的图片,重新组件  
    78.     CGImageRef imageRef = CGBitmapContextCreateImage (ctx);  
    79.     UIImage *returnImage = [UIImage imageWithCGImage:imageRef];  
    80.       
    81.     //clean up  
    82.     CGContextRelease(ctx);  
    83.     CGColorSpaceRelease(colorSpace);  
    84.       
    85.     free(pixelBuffer);  
    86.     free(pixelBuffer2);  
    87.     CFRelease(inBitmapData);  
    88.       
    89.     CGColorSpaceRelease(colorSpace);  
    90.     CGImageRelease(imageRef);  
    91.       
    92.     return returnImage;  
    93. }  
  • 相关阅读:
    写了一个好玩的小软件, 监视鼠标以及键盘的动作, 全局钩子. HowTired
    2005的五一计划
    给你的爱一直很安静
    沉重悼念蓝色理想经典论坛原Flash版主[手工感情][Handmade]
    一不小心就成就了一段姻缘,哈哈
    基于dotnet的代码统计工具新版发布
    四天三夜 刻骨铭心 颠峰战将 永不言败
    怎么回事?现在博客园极不稳定
    屋漏偏逢连夜雨, 船迟又遇打头风
    适用于IE浏览器及非IE浏览器的xmlhttp脚本
  • 原文地址:https://www.cnblogs.com/yuhaojishuboke/p/5043100.html
Copyright © 2011-2022 走看看