iOS图片打马赛克的实现方式--------终极解决方案

iOS图片打马赛克分辨率丢失,图片编辑完成之后保存原图分辨率方案,绘画时内存暴增导致闪退问题

--------终极解决方案

需求是做一个编辑图片功能,结果好不容易各种搜索实现了功能,结果发现一个无解的问题,保存图片的时候原图分辨率丢失了,生成就是用UIGraphicsGetImageFromCurrentImageContext()生成了一张屏幕大小尺寸的图,不用想,这种方式出来的图,分辨率肯定是丢失了的(手机截图除外~),在网上找了好多大牛写的博客看了好多发现基本都是这种方法,很奇怪,难道就没人提过这个问题吗?

个人整合了一下代码,实现了一种性能和功能都不错的图片马赛克编辑器
效果图:
效果图

实现功能:
  • 马赛克画笔功能,可自定义马赛克图案 ,马赛克大小
  • 编辑器可放大,放大后双指移动视图,单指画马赛克
  • 上一步,下一步
  • 实现了对原图做处理功能,并不是失真保存图案
  • 优化了处理时 CPU 占用太高问题
马赛克画笔思路

在实时显示时候,使用 CAShapeLayer 与 mask 蒙版的结合,达到马赛克画笔功能,在每一笔画完时候,使用 -drawRect 生成一张原图片大小的画布,在上面抠出马赛克画笔的路径,然后将马赛克图案与原图融合,达到马赛克效果。

Q:为什么要生成原图?

因为当前实时显示的马赛克效果,是原图按比例缩小到屏幕尺寸显示出来的,实际上,如果需要对原图处理,需要将移动路径点重新乘上缩小的比例,那么实时显示的点才是对应原图上的点
生成的图,并不是通过layer渲染的失真缩小图,网上马赛克功能的实现方式很多错在了这一步,这也是生成的图片失真的原因

重点: 当选择 A 马赛克图案作为画笔纹理时候,其实就是将马赛克图案作为一个 layer 寄宿图加载出来,通过mask蒙版遮住路径以外的位置,那么看到的是,路径所显示马赛克底图的路径了。每次画笔画完,都会保存一张每一笔处理完马赛克与原图的融合图,下次替换马赛克图案时候,如上面初始化方法,将上一笔生层融合图作为原图,新马赛克图案再作为layer,绘制新的马赛克。

图层:
图层示例

使用介绍 和 demo地址:
https://github.com/Small-Years/YJMosaicView

具体更深层次的实现原理问题,内存暴涨原因等,以下文章有非常详细的介绍:
http://isylar.com/2018/04/03/iOSMosaiImagePen/

个人经验,希望能帮到需要的人!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值