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

第一种使用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. leetcode 374. Guess Number Higher or Lower 、375. Guess Number Higher or Lower II

    374. Guess Number Higher or Lower 二分查找就好 // Forward declaration of guess API. // @param num, your gu ...

  2. [转]arcgis for server 10.2 下载及安装

    转自:https://blog.csdn.net/nominior/article/details/80211963 https://blog.csdn.net/mrib/article/detail ...

  3. [译]如何在GitHub仓库创建一个标签tag, 并推送到远程分支?

    问: 我在GitHub上有一个仓库,我需要给他打个tag.我在shell打了tag,但是在Github上没有显示出来.我还要做其他什么么? 我在shell中使用的命令是: git tag 2.0 当我 ...

  4. 安卓 android studio 报错 Lint found fatal errors while assembling a release target

    报错截图如下: 解决方法:在app的build.gradle中添加如下代码 android{ lintOptions { checkReleaseBuilds false abortOnError f ...

  5. Linux的桌面虚拟化技术KVM(四)——虚拟机镜像格式对比与转换

    Linux的桌面虚拟化技术KVM(一)——新建KVM虚拟机 Linux的桌面虚拟化技术KVM(二)——远程桌面管理 Linux的桌面虚拟化技术KVM(三)——KVM虚拟机克隆和快照 (1).常用镜像格 ...

  6. VS2010配置OpenGL开发环境(转)

    OpenGL(Open Graphics Library)是一个跨编程语言.跨平台的专业图形程序接口.OpenGL是SGI公司开发的一套计算机图形处理系统,是图形硬件的软件接口,任何一个OpenGL应 ...

  7. 迅速生成项目-vue-cli-service

    推荐指数:

  8. LODOP打印table不切行TableRowThickNess

    不切行的调整方法有三种:1.简单表格,不嵌套合并等,可以用ADD_PRINT_TABLE输出,该 语句不切行,相关博文:LODOP设置超文本不自动分页的方法.2.进入打印设计,调整打印项到合适的高度, ...

  9. Python:实现图片裁剪的两种方式——Pillow和OpenCV

    原文:https://blog.csdn.net/hfutdog/article/details/82351549 在这篇文章里我们聊一下Python实现图片裁剪的两种方式,一种利用了Pillow,还 ...

  10. web端调起Windows系统应用程序(exe执行文件),全面兼容所有浏览器

    1. 首先,你要有一个exe可执行文件2. 创建注册表创建注册表有两种方式(以“MyApp.exe”为例): 方式一:可视化编辑Win+R 打开运行,输入 regedit 并回车,进入注册表编辑器新建 ...