下面给大家介绍图片模糊效果的三种方法

第一种使用Core Image进行模糊

- (UIImage *)blurryImage:(UIImage *)image 

withBlurLevel:(CGFloat)blur { 

CIImage *inputImage = [CIImage imageWithCGImage:image.CGImage]; 

CIFilter *filter = [CIFilter filterWithName:@"CIGaussianBlur"

keysAndValues:kCIInputImageKey, inputImage, 

@"inputRadius", @(blur), 

]; CIImage *outputImage = filter.outputImage; 

CGImageRef outImage = [self.context createCGImage:outputImage 

fromRect:[outputImage extent]]; 

return [UIImage imageWithCGImage:outImage]; }

第二种使用vImage API进行模糊

- (UIImage *)blurryImage:(UIImage *)image withBlurLevel:(CGFloat)blur { 

if (blur < .f || blur > .f) { 

blur = 0.5f; 

} 

int boxSize = (int)(blur * ); 

boxSize = boxSize - (boxSize % ) + ; 

CGImageRef img = image.CGImage; 

vImage_Buffer inBuffer, outBuffer; 

vImage_Error error; 

void *pixelBuffer; 

CGDataProviderRef inProvider = CGImageGetDataProvider(img); 

CFDataRef inBitmapData = http://www.open-open.com/code/view/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, 

, 

, 

boxSize, 

boxSize, 

NULL, 

kvImageEdgeExtend); 

if (error) { 

NSLog(@"error from convolution %ld", error); 

} 

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 

CGContextRef ctx = CGBitmapContextCreate( 

outBuffer.data, 

outBuffer.width, 

outBuffer.height, 

, 

outBuffer.rowBytes, 

colorSpace, 

kCGImageAlphaNoneSkipLast); 

CGImageRef imageRef = CGBitmapContextCreateImage (ctx); 

UIImage *returnImage = [UIImage imageWithCGImage:imageRef]; 

//clean up 

CGContextRelease(ctx); 

CGColorSpaceRelease(colorSpace); 

free(pixelBuffer); 

CFRelease(inBitmapData); 

CGColorSpaceRelease(colorSpace); 

CGImageRelease(imageRef); 

return returnImage; }

第三种方法是网上找到的(毛玻璃效果)

// 内部方法,核心代码,封装了毛玻璃效果 参数:半径,颜色,色彩饱和度- (UIImage *)imageBluredWithRadius:(CGFloat)blurRadius tintColor:(UIColor *)tintColor saturationDeltaFactor:(CGFloat)saturationDeltaFactor maskImage:(UIImage *)maskImage { 

CGRect imageRect = { CGPointZero, self.size }; 

UIImage *effectImage = self; BOOL hasBlur = blurRadius > __FLT_EPSILON__; 

BOOL hasSaturationChange = fabs(saturationDeltaFactor - .) > __FLT_EPSILON__; if (hasBlur || hasSaturationChange) { UIGraphicsBeginImageContextWithOptions(self.size, NO, [[UIScreen mainScreen] scale]); 

CGContextRef effectInContext = UIGraphicsGetCurrentContext(); 

CGContextScaleCTM(effectInContext, 1.0, -1.0); 

CGContextTranslateCTM(effectInContext, , -self.size.height); 

CGContextDrawImage(effectInContext, imageRect, self.CGImage); 

vImage_Buffer effectInBuffer; effectInBuffer.data = http://www.open-open.com/code/view/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) { CGFloat inputRadius = blurRadius * [[UIScreen mainScreen] scale]; 

NSUInteger radius = floor(inputRadius * . * sqrt( * M_PI) /  + 0.5); 

if (radius %  != ) { 

radius += ; // force radius to be odd so that the three box-blur methodology works. 

} 

vImageBoxConvolve_ARGB8888(&effectInBuffer, &effectOutBuffer, NULL, , , (short)radius, (short)radius, , kvImageEdgeExtend); vImageBoxConvolve_ARGB8888(&effectOutBuffer, &effectInBuffer, NULL, , , (short)radius, (short)radius, , kvImageEdgeExtend); vImageBoxConvolve_ARGB8888(&effectInBuffer, &effectOutBuffer, NULL, , , (short)radius, (short)radius, , 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.7152 - 0.7152 * s, 0.7152 + 0.2848 * s, 0.7152 - 0.7152 * s, 

, 

0.2126 - 0.2126 * s, 0.2126 - 0.2126 * s, 0.2126 + 0.7873 * s, 

, 

, 

, 

, 

, 

}; 

const int32_t divisor = ; 

NSUInteger matrixSize = sizeof(floatingPointSaturationMatrix)/sizeof(floatingPointSaturationMatrix[]); int16_t saturationMatrix[matrixSize]; for (NSUInteger i = ; 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(); 

} 

// 开启上下文 用于输出图像 

UIGraphicsBeginImageContextWithOptions(self.size, NO, [[UIScreen mainScreen] scale]); 

CGContextRef outputContext = UIGraphicsGetCurrentContext(); 

CGContextScaleCTM(outputContext, 1.0, -1.0); 

CGContextTranslateCTM(outputContext, , -self.size.height); 

// 开始画底图 CGContextDrawImage(outputContext, imageRect, self.CGImage); 

// 开始画模糊效果 

if (hasBlur)

{ 

CGContextSaveGState(outputContext); 

if (maskImage) 

{ 

CGContextClipToMask(outputContext, imageRect, maskImage.CGImage); 

} CGContextDrawImage(outputContext, imageRect, effectImage.CGImage); 

CGContextRestoreGState(outputContext); 

} 

// 添加颜色渲染 

if (tintColor)

{ 

CGContextSaveGState(outputContext); 

CGContextSetFillColorWithColor(outputContext, tintColor.CGColor); 

CGContextFillRect(outputContext, imageRect); 

CGContextRestoreGState(outputContext); 

} 

// 输出成品,并关闭上下文 

UIImage *outputImage = UIGraphicsGetImageFromCurrentImageContext(); 

UIGraphicsEndImageContext(); 

return outputImage;}

iOS - 图片模糊效果实现的更多相关文章

  1. iOS图片模糊效果与阴影效果

    /** 添加图片模糊效果 @parms  要添加模糊效果的view @return */ + (UIVisualEffectView *)addVisualEffectViewWithView:(UI ...

  2. iOS图片模糊效果

    增加  CoreImage.framework  CoreGraphic.framework 等库 在使用时引入:#import <Accelerate/Accelerate.h> ,支持 ...

  3. iOS 图片背景模糊效果

    iOS 图片背景模糊效果 1.使用CoreImage中的模糊滤镜 原始效果图如下: CoreImage的实现: - (void)viewDidLoad { [super viewDidLoad]; / ...

  4. 实现iOS图片等资源文件的热更新化(三):动态的资源文件夹

    简介 此文,将尝试动态从某个不确定的文件夹中加载资源文件.文章,会继续完善自定义的 imageNamed 函数,并为下一篇文章铺垫. 这么做的意义 正如我们经常所说的那样,大多数情景知道做事的意义往往 ...

  5. iOS 图片轮播图(自动滚动)

    iOS 图片轮播图(自动滚动) #import "DDViewController.h" #define DDImageCount 5 @interface DDViewContr ...

  6. jquery mobile上传图片完整例子(包含ios图片横向问题处理和C#后台图片压缩)

    上传图片本身是个基本的小功能,但是到了移动端就不那么简单了,相信找到这篇文章的你一定有深深的同感. 本文实例是:在(移动端)页面中点击图片,然后选择文件,然后保存.使用Asp.net 难点一:后台获取 ...

  7. iOS图片加载到内存中占用内存情况

    我的测试结果: 图片占用内存   图片尺寸           .png文件大小 1MB              512*512          316KB 4MB              10 ...

  8. 实现iOS图片等资源文件的热更新化(五): 一个简单完整的资源热更新页面

    简介 一个简单的关于页面,有一个图片,版本号,App名称等,着重演示各个系列的文章完整集成示例. 动机与意义 这是系列文章的最后一篇.今天抽空写下,收下尾.文章本身会在第四篇的基础上,简单扩充下代码, ...

  9. 实现iOS图片等资源文件的热更新化(零): 序

    必要的序 以后在写系列文章,准备把基本的规划和动机等,单独作为一个小的序言部分给独立出来.序言部分,可以较为完整地交待系列文章的写作动机,所展示的编码技术可能的应用场景等.个人,我还是比较看重文章或者 ...

随机推荐

  1. nginx多层反向代理获取客户端真实ip

    访问路径: 用户 --> www.chinasoft.cn(nginx反向代理) --> www.chinasoft.com(nginx反向代理) --> python服务端程序 经 ...

  2. Objective-C轻量级泛型

    在Apple发布Xcode7的时候,不仅把Swift编程语言升级到了2.0版本,而且还对Objective-C做了许多提升,包括引入__nonnull/__nullable.其中,对于Objectiv ...

  3. 利用OpenGL固定流水线绘制球体

    在OS X上的一个OpenGL简单demo.所附赠的代码是绘制半个球体.开启了深度缓存和多重采样,采样数是4. 详细下载地址请见:http://www.cocoachina.com/bbs/read. ...

  4. 报错:flutter: Another exception was thrown: Could not find a generator for route RouteSettings

    原因是一个工程中多次使用MaterialApphttps://stackoverflow.com/questions/49132299/could-not-find-a-generator-for-r ...

  5. vscode片段

    参考资料 https://blog.csdn.net/maokelong95/article/details/54379046 "狂客注释": { "prefix&quo ...

  6. CA认证以及https的实现

    (1).CA认证 CA全称Certificate Authority,通常翻译成认证权威或者认证中心,主要用途是为用户发放数字证书.认证中心(CA)的功能:证书发放.证书更新.证书撤销和证书验证.CA ...

  7. (二十七)JVM类加载器机制与类加载过程

    一.Java虚拟机启动.加载类过程分析 下面我将定义一个非常简单的java程序并运行它,来逐步分析java虚拟机启动的过程. package org.luanlouis.jvm.load; impor ...

  8. CRC校验的问题(c语言实现CRC校验和)

    1. 前面的数 7A 01 00,计算的结果是0X4920 2. 那么把数据CRC加上 3. 测试代码,计算出来的结果对不上,什么情况?可是我把参考模型的全部都选了一遍,也对不上其中一个!!! 4.  ...

  9. Data - 【转】数据分析的道与术

    简要说明 本文来自网络流传的"百度内部培训PPT - 数据分析的道与术",版权属于"百度",如有冒犯,即刻删除. PDF下载 - 数据分析的道与术 什么是数据分 ...

  10. 【Tools】ModbusSlave 7.0和ModbusPoll 7.0官网最新软件+注册码

    某宝1.5元淘的:有币的求赏,小弟下载缺币.没币的从附件下载. 赏币地址:https://download.csdn.net/download/qq_18187161/10724794 谢谢! 无币百 ...