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

第一种使用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. 关于PHP7的CURL上传文件

    CULR 部分 $url = 'http://localhost/test/curlUploadFile/upload.php'; //处理上传的php文件,根据情况修改 $path='ftp.txt ...

  2. zabbix使用fping监控任意两个节点之间的网络质量、丢包率和响应时间

    zabbix使用fping监控任意两个节点之间的网络质量.丢包率和响应时间 之前的博文 使用zabbix3..4的ICMP Ping模版实现对客户端网络状态的监控 https://www.cnblog ...

  3. k8s记录-dockerfile

    FROM 代表基于哪个镜像 RUN 安装软件使用 MAINTAINER 镜像的创建者 CMD 容器启动时执行的命令,但是一个Dockerfile中只能有一条CMD命令,多条则只执行最后一条CMD EN ...

  4. ABAP DEMO ALVtree显示BOM层级

    展示效果: *&---------------------------------------------------------------------* *& Report YCX ...

  5. dubbo+zookeeper+springboot简单示例

    目录 dubbo+zookeeper+springboot简单示例 zookeeper安装使用 api子模块 生产者producer 消费者consumer @(目录) dubbo+zookeeper ...

  6. Python - Django - 静态文件相关

    静态文件的路径设置在 settings.py 中 如果该路径发生更改的话,html 中相关路径也要进行修改 CSS: <link href="/static/dashboard.css ...

  7. delphi self.Update 什么作用

    更新指定窗口的客户区.如果窗口更新的区域不为空,UpdateWindow函数就发送一个WM_PAINT消息来更新指定窗口的客户区.函数绕过应用程序的消息队列,直接发送WM_PAINT消息给指定窗口的窗 ...

  8. Docker学习笔记——1.2 Docker组件

    Docker的核心组件包括: Docker客户端和服务器,也称为Docker引擎: Docker镜像: Registry: Docker容器. 1.Docker客户端和服务器 Docker是一个客户端 ...

  9. 【linux基础-err】 tar命令-stdin: not in gzip format

    problem gzip: stdin: not in gzip format tar: Error is not recoverable: exiting now 解决方法 最后发现下载的压缩文件有 ...

  10. json 反序列化成键值对

    通过JsonConvert.DeserializeObject<Dictionary<string, object>>(string value)方法反序列化为字典数据,在通过 ...