博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
图片模糊处理
阅读量:4632 次
发布时间:2019-06-09

本文共 3678 字,大约阅读时间需要 12 分钟。

A.

使用vImage API进行模糊

iOS5.0中新增了vImage API可以使用,它属于Accelerate.Framework,所以如果你要使用它要在工程中加入这个Framework。模糊算法使用的是vImageBoxConvolve_ARGB8888这个函数。

1 - (UIImage *)blurredImageWithRadius:(CGFloat)radius iterations:(NSUInteger)iterations tintColor:(UIColor *)tintColor  2   3 {  4   5 //image must be nonzero size  6   7 if (floorf(self.size.width) * floorf(self.size.height) <= 0.0f) return self;  8   9 //boxsize must be an odd integer 10  11 uint32_t boxSize = (uint32_t)(radius * self.scale); 12  13 if (boxSize % 2 == 0) boxSize ++; 14  15 //create image buffers 16  17 CGImageRef imageRef = self.CGImage; 18  19 vImage_Buffer buffer1, buffer2; 20  21 buffer1.width = buffer2.width = CGImageGetWidth(imageRef); 22  23 buffer1.height = buffer2.height = CGImageGetHeight(imageRef); 24  25 buffer1.rowBytes = buffer2.rowBytes = CGImageGetBytesPerRow(imageRef); 26  27 size_t bytes = buffer1.rowBytes * buffer1.height; 28  29 buffer1.data = malloc(bytes); 30  31 buffer2.data = malloc(bytes); 32  33 //create temp buffer 34  35 void *tempBuffer = malloc((size_t)vImageBoxConvolve_ARGB8888(&buffer1, &buffer2, NULL, 0, 0, boxSize, boxSize, 36  37 NULL, kvImageEdgeExtend + kvImageGetTempBufferSize)); 38  39 //copy image data 40  41 CFDataRef dataSource = CGDataProviderCopyData(CGImageGetDataProvider(imageRef)); 42  43 memcpy(buffer1.data, CFDataGetBytePtr(dataSource), bytes); 44  45 CFRelease(dataSource); 46  47 for (NSUInteger i = 0; i < iterations; i++) 48  49 { 50  51 //perform blur 52  53 vImageBoxConvolve_ARGB8888(&buffer1, &buffer2, tempBuffer, 0, 0, boxSize, boxSize, NULL, kvImageEdgeExtend); 54  55 //swap buffers 56  57 void *temp = buffer1.data; 58  59 buffer1.data = buffer2.data; 60  61 buffer2.data = temp; 62  63 } 64  65 //free buffers 66  67 free(buffer2.data); 68  69 free(tempBuffer); 70  71 //create image context from buffer 72  73 CGContextRef ctx = CGBitmapContextCreate(buffer1.data, buffer1.width, buffer1.height, 74  75 8, buffer1.rowBytes, CGImageGetColorSpace(imageRef), 76  77 CGImageGetBitmapInfo(imageRef)); 78  79 //apply tint 80  81 if (tintColor && CGColorGetAlpha(tintColor.CGColor) > 0.0f) 82  83 { 84  85 CGContextSetFillColorWithColor(ctx, [tintColor colorWithAlphaComponent:0.25].CGColor); 86  87 CGContextSetBlendMode(ctx, kCGBlendModePlusLighter); 88  89 CGContextFillRect(ctx, CGRectMake(0, 0, buffer1.width, buffer1.height)); 90  91 } 92  93 //create image from context 94  95 imageRef = CGBitmapContextCreateImage(ctx); 96  97 UIImage *image = [UIImage imageWithCGImage:imageRef scale:self.scale orientation:self.imageOrientation]; 98  99 CGImageRelease(imageRef);100 101 CGContextRelease(ctx);102 103 free(buffer1.data);104 105 return image;106 107 }
点击展开代码

 

B.

 就是用coreImage中苹果提供的滤镜效果,但是此方法效率低且需要转化时相对间比较长

//CPU渲染。。慢效率低,为了避免线程阻塞,最好放在子线程里。

1 - (UIImage *)blur{ 2  3 CIContext *context = [CIContext contextWithOptions:nil]; 4  5 CIImage *imageToBlur = [[CIImage alloc]initWithImage:_imgview.image]; 6  7 CIFilter *filter = [CIFilter filterWithName:@"CIGaussianBlur" keysAndValues:kCIInputImageKey,imageToBlur ,nil]; 8  9 _outputCIImage = [filter outputImage];10 11 UIImage *img = [UIImage imageWithCGImage:[context createCGImage:_outputCIImage fromRect:_outputCIImage.extent]];12 13 return img;14 15 }

C.iOS8新出的功能。特别方便,还能支持实时模糊,缺点就是只能iOS8以上使用

1 - (IBAction)iOS8blurAction:(id)sender { 2  3 UIBlurEffect *beffect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleExtraLight]; 4  5 UIVisualEffectView *view = [[UIVisualEffectView alloc]initWithEffect:beffect]; 6  7 view.frame = self.bounds; 8  9 [self addSubview:view];10 11 }

D.GPUImage

http://www.cocoachina.com/industry/20140210/7793.html

 

转载于:https://www.cnblogs.com/tig666666/p/5461568.html

你可能感兴趣的文章
jquery禁用a标签,jquery禁用按钮click点击
查看>>
ccleaner Command-line parameters
查看>>
课后作业-阅读任务-阅读提问-3
查看>>
LIBCLNTSH.SO: WRONG ELF CLASS: ELFCLASS32错误一例
查看>>
如何禁止特定用户使用sqlplus或PL/SQL Developer等工具登陆?
查看>>
Ubuntu 14.04安装配置NFS服务器
查看>>
关于表单的使用
查看>>
Vue入门
查看>>
C - 娜娜梦游仙境系列——吃不完的糖果
查看>>
巴黎公社社员造船厂Project1129研制成功
查看>>
poj2007极角排序
查看>>
POJ 1204 Word Puzzles
查看>>
JEESZ分布式框架--单点登录集成方案
查看>>
三元表达式,列表生成式,字典生成式,生成器表达式
查看>>
.net core集成 vue
查看>>
ZOJ3829---模拟,贪心
查看>>
Windows XP系列全下载(均为MSDN原版)
查看>>
如何提高ASP.NET性能
查看>>
vh属性-- 一个永远垂直居中的弹出框
查看>>
LAMP集群项目三 配置业务服务器
查看>>