美文网首页图片处理
iOS图片打马赛克保存原图分辨率

iOS图片打马赛克保存原图分辨率

作者: 明天就去 | 来源:发表于2019-01-28 17:10 被阅读19次

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

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

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

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

效果图:

效果图

实现功能:

- 马赛克画笔功能,可自定义马赛克图案 ,马赛克大小

- 编辑器可放大,放大后双指移动视图,单指画马赛克

- 上一步,下一步

- 实现了对原图做处理功能,并不是失真保存图案

- 优化了处理时 CPU 占用太高问题

 马赛克画笔思路

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

Q:为什么要生成原图?

因为当前实时显示的马赛克效果,是原图按比例缩小到屏幕尺寸显示出来的,实际上,如果需要对原图处理,需要将移动路径点重新乘上缩小的比例,那么实时显示的点才是对应原图上的点

生成的图,并不是通过layer渲染的失真缩小图,网上马赛克功能的实现方式很多错在了这一步,这也是生成的图片失真的原因

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

图层:

使用介绍 和  demo地址:

github

具体更深层次的实现原理问题,内存暴涨原因等,以下文章有非常详细的介绍:

http://isylar.com/2018/04/03/iOSMosaiImagePen/

个人经验,希望能帮到需要的人,如果老板非要赞赏一下的话,我不会拒绝的哦~

相关文章

网友评论

    本文标题:iOS图片打马赛克保存原图分辨率

    本文链接:https://www.haomeiwen.com/subject/taaajqtx.html