最近项目里新增了图片编辑模块,其中一个功能点就是手指涂抹图片,实现图片的局部模糊,网上搜到了关于很多模糊图片的资料,但是关于根据手指路径来模糊图片的基本上没有(马赛克类型的模糊还是存在的),经过一段时间研究之后,实现了功能,本着共享的原则,在这里和大家分享一下,有问题的地方,希望大家指出,谢谢

一、思路

1、实时截取图片部分区域,然后用高斯模糊的方法,再把图片描绘到想要模糊的图层上

2、贝塞尔曲线+CALayer(CAShapeLayer),追加路径的方式,模糊图片

第一种方式,是我一开始着手这个模块的思路,也实现了这个功能,不过很快也就放弃了,经验丰富的只要思考一下,就能想得到,很难做到实时,另外,这种方式,无法做到是非流畅,可以说越是到后期越卡,目前没有想到很好的解决方法,如果哪位大佬有好的方法,请告之

第二种方式,感觉是处理这种功能点最好的方式了,流畅程度非常的完美,这里也是使用Accelerate中的vImage进行高斯模糊

二、遇到的问题

遇到的第一个难点就是上述两种实现方式的选择问题,方向错误给我带了不少麻烦;然后就是自测的时候,你会发现模糊路径的颜色值会发生改变,网上提供了很多的模糊方法,但是都存在不同程度的颜色值改变,后面会给大家提供方法;再者就是撤回操作,撤回操作我的思路是存数组,本人感觉比较简单方便,但是仅仅利用数组里存的image复制给imageView的话,无法实现撤回功能,究其原因在于layer层的问题,有兴趣的可以了解一下

下面分享一下代码:

使用Accelerate中的vImage进行高斯模糊

- (UIImage *)blurryImage:(UIImage *)image withBlurLevel:(CGFloat)blur {NSData *imageData = UIImageJPEGRepresentation(image, 1); // convert to jpegUIImage* destImage = [UIImage imageWithData:imageData];int boxSize = (int)(blur * 100);if (blur > 0.5) {boxSize = (int)(blur * 100) + 50;}else if (blur <= 0.5) {boxSize = (int)(blur * 100);}boxSize = boxSize - (boxSize % 2) + 1;CGImageRef img = destImage.CGImage;vImage_Buffer inBuffer, outBuffer;vImage_Error error;void *pixelBuffer;//create vImage_Buffer with data from CGImageRefCGDataProviderRef inProvider = CGImageGetDataProvider(img);CFDataRef inBitmapData = CGDataProviderCopyData(inProvider);inBuffer.width = CGImageGetWidth(img);inBuffer.height = CGImageGetHeight(img);inBuffer.rowBytes = CGImageGetBytesPerRow(img);inBuffer.data = (void*)CFDataGetBytePtr(inBitmapData);//create vImage_Buffer for outputpixelBuffer = 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);// Create a third buffer for intermediate processingvoid *pixelBuffer2 = malloc(CGImageGetBytesPerRow(img) * CGImageGetHeight(img));vImage_Buffer outBuffer2;outBuffer2.data = pixelBuffer2;outBuffer2.width = CGImageGetWidth(img);outBuffer2.height = CGImageGetHeight(img);outBuffer2.rowBytes = CGImageGetBytesPerRow(img);//perform convolutionerror = vImageBoxConvolve_ARGB8888(&inBuffer, &outBuffer2, NULL, 0, 0, boxSize, boxSize, NULL, kvImageEdgeExtend);if (error) {NSLog(@"error from convolution %ld", error);}error = vImageBoxConvolve_ARGB8888(&outBuffer2, &inBuffer, NULL, 0, 0, boxSize, boxSize, NULL, kvImageEdgeExtend);if (error) {NSLog(@"error from convolution %ld", error);}error = vImageBoxConvolve_ARGB8888(&inBuffer, &outBuffer, NULL, 0, 0, boxSize, boxSize, NULL, kvImageEdgeExtend);if (error) {NSLog(@"error from convolution %ld", error);}CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();CGContextRef ctx = CGBitmapContextCreate(outBuffer.data,outBuffer.width,outBuffer.height,8,outBuffer.rowBytes,colorSpace,(CGBitmapInfo)kCGImageAlphaNoneSkipLast);CGImageRef imageRef = CGBitmapContextCreateImage (ctx);UIImage *returnImage = [UIImage imageWithCGImage:imageRef];//clean upCGContextRelease(ctx);CGColorSpaceRelease(colorSpace);free(pixelBuffer);free(pixelBuffer2);CFRelease(inBitmapData);CGImageRelease(imageRef);return returnImage;
}
复制代码

添加CAShapeLayer

- (void)addCAShapeLayer {CALayer *imageLayer = [CALayer layer];imageLayer.frame = self.imageView.bounds;[self.imageView.layer addSublayer:imageLayer];_shapeLayer = [CAShapeLayer layer];_shapeLayer.frame = self.imageView.bounds;_shapeLayer.lineCap = kCALineCapRound;_shapeLayer.lineJoin = kCALineJoinRound;_fuzzyWith = (34 * _fuzzySizeValue) + 8;_shapeLayer.lineWidth = _fuzzyWith;_shapeLayer.fillColor = [UIColor clearColor].CGColor;_shapeLayer.strokeColor = [UIColor whiteColor].CGColor;[self.imageView.layer addSublayer:_shapeLayer];imageLayer.mask = _shapeLayer;self.path = CGPathCreateMutable();UIImage *img1 = [self blurryImage:self.imageView.image withBlurLevel:_fuzzyDegreeValue];self.imageView.clipsToBounds = YES;imageLayer.contents = (id)img1.CGImage;
}复制代码

由于项目需求,demo里提供了改变画笔(轨迹路径的大小)大小,以及模糊程度的slider,为了方便大家,封装的demo有接口,直接传值即可;总结一下,高斯模糊有很多种,Accelerate 的模糊是最靠谱的,速度和效果都非常完美,只是会占用更高的cpu。

demo地址:github.com/SXDgit/ZBFu…

iOS 手指涂抹--局部模糊图片相关推荐

  1. svg模糊图片局部清晰透视图

    demo下载地址: http://download.csdn.net/download/one_girl/10163426 html代码: <body><div class=&quo ...

  2. iOS Swift处理点9图片

    一.什么是点9图? 点9图是Android开发中用到的一种特殊格式的图片,后缀名是".9.png"的图片.左上两条线控制可拉伸区域(未画线表示不可拉伸),右下两条线控制内容显示区( ...

  3. Sketch教程如何实现背景局部模糊

    Sketch中如何实现背景局部模糊?Sketch中想要实现背景模糊的效果,不需要模糊就不模糊,该怎么操作呢?下面我们就来看看Sketch背景局部模糊的技巧,需要的朋友可以参考. 1.首先安装并打开sk ...

  4. 在手机上如何修复模糊图片放大变清晰?收藏这3个超好用的AI神器!

    经常有小伙伴问我,有没有在手机上就能使用的图片放大变清晰工具呢?手机上可以用的修复图片工具,无非是网站.小程序和app,今天就给宝子们分享3个亲测好用的修复图片变清晰工具,全部都是可以免费使用的,话不 ...

  5. Facebook iOS 应用是如何加速图片显示的?

    本文讲的是Facebook iOS 应用是如何加速图片显示的?, 你的Facebook的动态消息中充满着一些关于你朋友.家人以及你所爱的人的照片,也许你会想要在手机上也能重温那些场景.我们一直在寻找提 ...

  6. Google 超分辨率技术 RAISR:模糊图片瞬间变清晰,运算速度快十倍

    Google 超分辨率技术 RAISR:模糊图片瞬间变清晰,运算速度快十倍 Everyday the web is used to share and store millions of pictur ...

  7. IOS疯狂基础之GIF图片的显示

    2019独角兽企业重金招聘Python工程师标准>>> IOS疯狂基础之GIF图片的显示 iPhone SDK提供了多种动画手段,UIView.UIImageView和CALayer ...

  8. iOS 两种不同的图片无限轮播

    代码地址如下: http://www.demodashi.com/demo/11608.html 前记 其实想写这个关于无限轮播的记录已经很久很久了,只是没什么时间,这只是一个借口,正如:时间就像海绵 ...

  9. IOS多选单选相册图片

    IOS多选单选相册图片 之前做项目让实现多选相册的图片,自己写了一个demo一直保存在电脑上,今天下午发现电脑128G的容量已经快没有了,准备清理电脑,所以把之前做的一些demo放在博客上,以后方便用 ...

最新文章

  1. 在对人的管理上,项目经理应该做些什么?
  2. 我的Python成长之路---第一天---Python基础(5)---2015年12月26日(雾霾)
  3. 闭包的示例_用示例解释JavaScript中的闭包
  4. pgslq表的字段类型_Python 爬取微信公众号文章和评论 (基于 Fiddler 抓包分析)
  5. 通过TextWatcher去观察输入框中输入的内容以及输入字符个数
  6. access统计各职务人数_东莞各阶段学生人数统计|终于知道为什么在东莞总是学位紧缺了...
  7. mysql客户端介绍
  8. 推荐微信小程序常用的几个UI组
  9. mac win7 计算机,几步教会你win7更改mac地址_win7电脑改mac地址方法
  10. 详细解读TPH-YOLOv5 | 让目标检测任务中的小目标无处遁形
  11. xp桌面图标阴影解决方案
  12. 输入一个大写字母,打印菱形
  13. allegro不规则焊盘制作
  14. Texture2D变Sprite
  15. python最佳身高_Python+sklearn使用线性回归算法预测儿童身高
  16. 论文精度 —— 2017 CVPR《High-Resolution Image Inpainting using Multi-Scale Neural Patch Synthesis》
  17. 数据库数据导入word文档
  18. 我感觉的优美诗句品鉴(不定时更新)
  19. 2021年5月:百度最近的文章收录变慢了?连老站都不好使了?
  20. 画线 css,CSS画线方法

热门文章

  1. py pandas 库及 excel 文件读写
  2. 【其他】开启Gitee Pages 服务
  3. VUE + flv视频的播放与切换
  4. 区块链糖果:alpha协议,打造专注获取α收益的对冲基金协议共同体
  5. 并行处理及分布式系统期末总结笔记
  6. YouTube排名第一的励志英文演讲《Dream(梦想)》
  7. linux 在指定行后写入文件内容,linux命令行下将指定的几行内容写入到一个文件中...
  8. 阻止事件冒泡和阻止默认事件的方法
  9. 跨境电商培训班分享:亚马逊运营必须掌握的知识点
  10. Rendering-Camera from Real to Unreal(1)-真实相机