iOS图片打马赛克分辨率丢失,图片编辑完成之后保存原图分辨率方案,绘画时内存暴增导致闪退问题
--------终极解决方案
需求是做一个编辑图片功能,结果好不容易各种搜索实现了功能,结果发现一个无解的问题,保存图片的时候原图分辨率丢失了,生成就是用UIGraphicsGetImageFromCurrentImageContext()生成了一张屏幕大小尺寸的图,不用想,这种方式出来的图,分辨率肯定是丢失了的(手机截图除外~),在网上找了好多大牛写的博客看了好多发现基本都是这种方法,很奇怪,难道就没人提过这个问题吗
个人整合了一下代码,实现了一种性能和功能都不错的图片马赛克编辑器
效果图:
实现功能:
- 马赛克画笔功能,可自定义马赛克图案 ,马赛克大小
- 编辑器可放大,放大后双指移动视图,单指画马赛克
- 上一步,下一步
- 实现了对原图做处理功能,并不是失真保存图案
- 优化了处理时 CPU 占用太高问题
马赛克画笔思路
在实时显示时候,使用 CAShapeLayer 与 mask 蒙版的结合,达到马赛克画笔功能,在每一笔画完时候,使用 -drawRect 生成一张原图片大小的画布,在上面抠出马赛克画笔的路径,然后将马赛克图案与原图融合,达到马赛克效果。
Q:为什么要生成原图?
因为当前实时显示的马赛克效果,是原图按比例缩小到屏幕尺寸显示出来的,实际上,如果需要对原图处理,需要将移动路径点重新乘上缩小的比例,那么实时显示的点才是对应原图上的点
生成的图,并不是通过layer渲染的失真缩小图,网上马赛克功能的实现方式很多错在了这一步,这也是生成的图片失真的原因
重点: 当选择 A 马赛克图案作为画笔纹理时候,其实就是将马赛克图案作为一个 layer 寄宿图加载出来,通过mask蒙版遮住路径以外的位置,那么看到的是,路径所显示马赛克底图的路径了。每次画笔画完,都会保存一张每一笔处理完马赛克与原图的融合图,下次替换马赛克图案时候,如上面初始化方法,将上一笔生层融合图作为原图,新马赛克图案再作为layer,绘制新的马赛克。
图层:
使用介绍 和 demo地址:
github
具体更深层次的实现原理问题,内存暴涨原因等,以下文章有非常详细的介绍:
http://isylar.com/2018/04/03/iOSMosaiImagePen/
个人经验,希望能帮到需要的人,如果老板非要赞赏一下的话,我不会拒绝的哦~