iOS开发-图片上涂鸦绘制撤销功能

iOS开发-图片上涂鸦绘制撤销功能

当我们需要重新在图片上进行绘制涂鸦生成新的图,这里使用到了Graphics中的API功能。
Graphics Framework是一套基于C的API框架,使用了Quartz作为绘图引擎。它提供了低级别、轻量级、高保真度的2D渲染。
在这里插入图片描述
微信搜索小游戏《全民保卫地球》玩玩吧,lets go

一、涂鸦绘制流程

使用涂鸦绘制使用Graphics,涂鸦流程如下

  • UIGraphicsBeginImageContextWithOptions 开始截图的方法
  • UIGraphicsGetCurrentContext 获取当前上下文
  • CGContextSetLineWidth 设置画笔宽度
  • CGContextSetStrokeColor 设置画笔颜色
  • CGContextSetLineCap 设置LineCap
  • CGContextMoveToPoint 移动到开始点
  • CGContextAddLineToPoint 添加line到目的point
  • CGContextStrokePath 把路径绘制到上下文
  • UIGraphicsGetImageFromCurrentImageContext 获得UIImage
  • UIGraphicsEndImageContext 关闭图片上下文

代码如下

-(void)drawLine:(CGPoint)from to:(CGPoint)to
{CGSize size = _drawingView.frame.size;UIGraphicsBeginImageContextWithOptions(size, NO, 0.0);CGContextRef context = UIGraphicsGetCurrentContext();[self.drawingView.image drawAtPoint:CGPointZero];CGContextSetLineWidth(context, self.strokeWidth);CGContextSetStrokeColorWithColor(context, self.strokeColor.CGColor);CGContextSetLineCap(context, kCGLineCapRound);// 橡皮擦if(self.erasered){CGContextSetBlendMode(context, kCGBlendModeClear);}CGContextMoveToPoint(context, from.x, from.y);CGContextAddLineToPoint(context, to.x, to.y);CGContextStrokePath(context);self.drawingView.image = UIGraphicsGetImageFromCurrentImageContext();UIGraphicsEndImageContext();
}

Graphics中还有更多其他API,可以尝试一下。上面的代码进行从from点到to点根据画笔颜色及宽度绘制线条,获得新的图

二、涂鸦手势移动实现绘制

在图片上进行涂鸦,我们需要UIPanGestureRecognizer来实现。UIGestureRecognizer是UIKit框架中的一个基类,用于识别并响应用户的手势操作。

在图片上添加手

定义变量

{CGPoint _prevDraggingPosition;CGSize _originalImageSize;
}
- (UIImageView *)drawingView {if (!_drawingView) {_drawingView = [[UIImageView alloc] initWithFrame:CGRectZero];UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(drawingViewDidPan:)];panGesture.maximumNumberOfTouches = 1;_drawingView.userInteractionEnabled = YES;[_drawingView addGestureRecognizer:panGesture];}return _drawingView;
}

实现手势事件
每次手势状态UIGestureRecognizerStateChanged下调用drawLine方法进行,手势结束后存储当前绘制线条的图片

- (void)drawingViewDidPan:(UIPanGestureRecognizer*)sender
{CGPoint currentDraggingPosition = [sender locationInView:_drawingView];if(sender.state == UIGestureRecognizerStateBegan){_prevDraggingPosition = currentDraggingPosition;}if(sender.state != UIGestureRecognizerStateEnded){[self drawLine:_prevDraggingPosition to:currentDraggingPosition];}_prevDraggingPosition = currentDraggingPosition;if (sender.state == UIGestureRecognizerStateEnded) {if (self.drawingView.image) {[self.revokeImages addObject:self.drawingView.image];}}
}

三、开启橡皮擦功能

橡皮擦功能其实就是CGContextSetBlendMode,将颜色设置了透明色。

// 橡皮擦if(self.erasered){CGContextSetBlendMode(context, kCGBlendModeClear);}

四、撤销功能

撤销功能本质上还是切换图片,将revokeImages存储的图片进行移除操作。

- (void)drawToolDidRevoke {if (self.revokeImages.count > 0) {[self.revokeImages removeLastObject];}if (self.revokeImages.count > 0) {UIImage *image = [self.revokeImages lastObject];self.drawingView.image = image;} else {self.drawingView.image = nil;}
}

如果取消的话就移除全部图片

- (void)drawToolDidCleanAll {self.drawingView.image = nil;[self.revokeImages removeAllObjects];
}

五、设置涂鸦颜色及width

设置涂鸦颜色就是更改strokeColor,width就是更改画笔宽度

六、小结

iOS开发-图片上涂鸦绘制撤销功能

学习记录,每天不停进步。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3280762.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

单线程 和多线程区别,看打印输出1000个数字效果

执⾏过程: 加载func() -> 执⾏main -> 创建⼦线程t -> ⼦线程t启动 -> 执⾏func中的内容 |-> 继续执⾏main from threading import Thread #此线程不用安装自带。T是大写注意哟 def func():for i in range(1000):print(func,i) #定义一个函数打印 if __name__ …

<数据集>DOTA v1.0遥感航拍目标识别数据集<目标检测>

数据集格式:VOCYOLO格式 图片数量:1869张(训练集1411,验证集458) 标注数量(xml文件个数):1869 标注数量(txt文件个数):1869 标注类别数:15 标注类别名称:[plane, ba…

基于Python的哔哩哔哩国产动画排行数据分析系统

需要本项目的可以私信博主,提供完整的部署、讲解、文档、代码服务 随着经济社会的快速发展,中国影视产业迎来了蓬勃发展的契机,其中动漫产业发展尤为突出。中国拥有古老而又璀璨的文明,仅仅从中提取一部分就足以催生出大量精彩的…

python——joblib进行缓存记忆化-对计算结果缓存

问题场景 在前端多选框需要选取多个数据进行后端计算。 传入后端是多个数据包的对应路径。 这些数据包需要按一定顺序运行,通过一个Bag(path).get_start_time() 可以获得一个float时间值进行排序,但由于数据包的特性,这一操作很占用性能和时…

碰撞检测 | 矩形增量膨胀安全走廊模型(附C++/Python仿真)

目录 0 专栏介绍1 安全走廊建模的动机2 矩形增量膨胀算法3 算法仿真3.1 C实现3.2 Python实现 0 专栏介绍 🔥课设、毕设、创新竞赛必备!🔥本专栏涉及更高阶的运动规划算法轨迹优化实战,包括:曲线生成、碰撞检测、安全走…

哪个牌子的眼镜清洗机好?买超声波清洗机有必要吗

生活中,我们经常忽视眼镜的清洁。你知道吗?眼镜如果长时间不清洁的话,镜片上的污垢和油脂会让视线变得模糊不清,甚至油污滋生的细菌还可能伤害到我们的眼睛,比如引起眼睛疲劳或炎症。为了保持眼镜干净,现在…

生鲜 52 周 MD如何助力业绩提升

生鲜 52 周 MD ,顾名思义,就是以一年 52 周为周期,对生鲜商品进行精细化、动态化的营销规划。它不再是传统的固定化、模式化的销售方式,而是根据每周的季节特点、节日氛围、消费趋势以及市场变化,精心策划生鲜商品的种…

11 优化器

目录 1. 随机梯度下降系优化器:SGD 1.1 算法种类 1.2 优缺点 2 SGDM 即为SGD with momentum 动量 2.1 公式 2.2 动量的优缺点 优点 缺点 2.3 使用场景 3 AdaGrad 3.1 公式 3.2 AdaGrad的优缺点 优点 缺点 3.3 使用场景 3.4 Adam 3.4.1 Adam优化器的…

计算机网络01

文章目录 浏览器输入URL后发生了什么?Linux 系统是如何收发网络包的?Linux 网络协议栈Linux 接收网络包的流程Linux 发送网络包的流程 浏览器输入URL后发生了什么? URL解析 当在浏览器中输入URL后,浏览器首先对拿到的URL进行识别…

2024最全RabbitMQ集群方案汇总

之前在网上找rabbitmq集群方案有哪几种时,基本上看到的答案都不太一样,所以此文的主要目的是梳理一下rabbitmq集群方案,对rabbitmq集群方案的笔记并不是搭建的笔记。 总结了一些文章,rabbitmq集群大概有五种方案:普通…

[Linux安全运维] iptables包过滤

前言 防火墙是网络安全中非常重要的设备,是一种将内部网络和外部网络隔离开的技术。简单来说,防火墙技术就是访问控制技术,由规则和动作组成。 1. Linux 包过滤防火墙 1 .1 概述 iptables: 指的是管理Linux防火墙的命令程序&a…

Windows 下后台启动 jar 包,UTF-8 启动 jar 包_windows启动jar

转自:https://blog.csdn.net/2401_83817971/article/details/137514739 本文介绍了如何使用javaw.exe后台启动Javajar包,如何在Windows中管理和设置cmd编码,以及与Python开发相关的学习资源。包括UTF-8编码启动jar包的方法和Windows下关闭后台服务的技…

superset 不显示mysql的选项问题

superset不显示mysql的选项 数据库驱动未安装:确保你已经安装了Python的MySQL数据库驱动,比如mysqlclient。 pip install mysqlclient

vue一些npm i 时报错问题解决【JAVA前后端分离】

前端vue npm i 安装时出现 作为一个懂些前端得 JAVA开发自然是要粗暴解决这个问题了 问题解决 使用命令 npx -p npm6 npm i 即可编译 原因: ERESOLVE与npm版本有关,因为npm版本高对某些事情比npm6.x更严格。通常,最简单的解决方法是将--…

【机器学习基础】机器学习概述与实践基础

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈Python机器学习 ⌋ ⌋ ⌋ 机器学习是一门人工智能的分支学科,通过算法和模型让计算机从数据中学习,进行模型训练和优化,做出预测、分类和决策支持。Python成为机器学习的首选语言,…

STC12C5A60S2单片机输出pwm的方法

所谓的pwm输出就是让单片机在某个管脚上按照时间输出特定频率和占空比的矩形方波。这里面有两个参数,一是频率,二是占空比。两者互不干涉。以STC12C5A60S2为例子,本51型单片机可以有两路pwm输出。以其中的一路为例说明; 首先说频…

Teltonika FMXXX系列定位器解析说明

1.产品外观 2.数据包说明 2.1.登录包 **模块第一次上线,先发送其对应的IMEI号,数据包如下:** 000F313233343536373839303132333435**数据包解析如下:** 000F --packet starts 313233343536373839303132333435 --IMEI 1234567890…

区块链软硬件协同,做产业数字化转型的“安全官” |《超话区块链》直播预告

今年的两会政府工作报告提出:“产业的数字化(行业数字化转型)是发展新质生产力的核心,是推动产业升级实现高质量发展的关键。”全面推进产业数字化,需要技术创新与产业应用深入协同;立足可持续发展的长远目…

泰迪智能科技入选广东省2024年第三批职业技能等级认定社会培训评价组织名单

7月17日,根据《关于公布广东省2023年社会培训评价组织新申请机构进入培育辅导期名单的通知》(粤人社函〔2023〕269号)、《关于公布广东省2023年社会培训评价组织(“产教评”链主培育单位)进入培育辅导期名单的通知》&a…

网络安全是什么?怎么入门网络安全?

一、网络安全的定义 网络安全,简单来说,就是保护网络系统中的硬件、软件以及其中的数据不因偶然或恶意的原因而遭到破坏、更改、泄露,保障系统连续可靠正常地运行,网络服务不中断。 随着信息技术的飞速发展,网络安全的…