iOS 图片编辑——涂鸦——随手指移动随意画线

iOS 涂鸦 我们已经讲过画直线 和画带箭头的线段

参考:http://blog.csdn.net/lwjok2007/article/details/50885376

这节 我们尝试做一下 随意画 手指移动到哪里就在哪里画线 如下图所示:


使用Xcode创建项目,起名:TestFingerLine  (详细的创建方法 参照  http://blog.csdn.net/lwjok2007/article/details/50865598)

首先我们 抽象出两个类

1,一个UIView专门负责接受手指滑动事件,显示涂鸦 

2,一个类用来存储线段信息(我们可以把涂鸦理解成一堆直线组成的图形,每当手指挪动一点就是一条直线,整个涂鸦其实就是很多个很短的线段组成的) 具体我们可以通过代码来理解

第一个类 起名: FingerDrawLine   (继承UIView)

第二个类 起名: FingerDrawLineInfo  (继承NSObject

创建好 之后 如下图


我们先实现一下 FingerDrawLineInfo 

#import <UIKit/UIKit.h>@interface FingerDrawLineInfo : NSObject@property (nonatomic,strong)NSMutableArray <__kindof NSValue *>*linePoints;//线条所包含的所有点
@property (nonatomic,strong)UIColor *lineColor;//线条的颜色
@property (nonatomic)float lineWidth;//线条的粗细@end


#import "FingerDrawLineInfo.h"@implementation FingerDrawLineInfo- (instancetype)init {if (self=[super init]) {self.linePoints = [[NSMutableArray alloc] initWithCapacity:10];}return self;
}@end


接下来我们实现 FingerDrawLineInfo

#import <UIKit/UIKit.h>
#import "FingerDrawLineInfo.h"@interface FingerDrawLine : UIView//所有的线条信息,包含了颜色,坐标和粗细信息 @see DrawPaletteLineInfo
@property(nonatomic,strong) NSMutableArray  *allMyDrawPaletteLineInfos;
//从外部传递的 笔刷长度和宽度,在包含画板的VC中 要是颜色、粗细有所改变 都应该将对应的值传进来
@property (nonatomic,strong)UIColor *currentPaintBrushColor;
@property (nonatomic)float currentPaintBrushWidth;//外部调用的清空画板和撤销上一步
- (void)cleanAllDrawBySelf;//清空画板
- (void)cleanFinallyDraw;//撤销上一条线条@end


#import "FingerDrawLine.h"@implementation FingerDrawLine#pragma mark - init
- (id)initWithFrame:(CGRect)frame {self = [super initWithFrame:frame];if (self) {_allMyDrawPaletteLineInfos = [[NSMutableArray alloc] initWithCapacity:10];self.currentPaintBrushColor = [UIColor blackColor];self.backgroundColor = [UIColor clearColor];self.currentPaintBrushWidth =  4.f;}return self;}#pragma  mark - draw event
//根据现有的线条 绘制相应的图画
- (void)drawRect:(CGRect)rect  {CGContextRef context=UIGraphicsGetCurrentContext();CGContextSetLineCap(context, kCGLineCapRound);CGContextSetLineJoin(context, kCGLineJoinRound);if (_allMyDrawPaletteLineInfos.count>0) {for (int i=0; i<[self.allMyDrawPaletteLineInfos count]; i++) {FingerDrawLineInfo *info = self.allMyDrawPaletteLineInfos[i];CGContextBeginPath(context);CGPoint myStartPoint=[[info.linePoints objectAtIndex:0] CGPointValue];CGContextMoveToPoint(context, myStartPoint.x, myStartPoint.y);if (info.linePoints.count>1) {for (int j=0; j<[info.linePoints count]-1; j++) {CGPoint myEndPoint=[[info.linePoints objectAtIndex:j+1] CGPointValue];CGContextAddLineToPoint(context, myEndPoint.x,myEndPoint.y);}}else {CGContextAddLineToPoint(context, myStartPoint.x,myStartPoint.y);}CGContextSetStrokeColorWithColor(context, info.lineColor.CGColor);CGContextSetLineWidth(context, info.lineWidth+1);CGContextStrokePath(context);}}
}#pragma mark - touch event
//触摸开始
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {UITouch* touch=[touches anyObject];[self drawPaletteTouchesBeganWithWidth:self.currentPaintBrushWidth andColor:self.currentPaintBrushColor andBeginPoint:[touch locationInView:self ]];[self setNeedsDisplay];
}
//触摸移动
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {NSArray* MovePointArray=[touches allObjects];[self drawPaletteTouchesMovedWithPonit:[[MovePointArray objectAtIndex:0] locationInView:self]];[self setNeedsDisplay];
}- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {}#pragma mark draw info edite event
//在触摸开始的时候 添加一条新的线条 并初始化
- (void)drawPaletteTouchesBeganWithWidth:(float)width andColor:(UIColor *)color andBeginPoint:(CGPoint)bPoint {FingerDrawLineInfo *info = [FingerDrawLineInfo new];info.lineColor = color;info.lineWidth = width;[info.linePoints addObject:[NSValue valueWithCGPoint:bPoint]];[self.allMyDrawPaletteLineInfos addObject:info];
}//在触摸移动的时候 将现有的线条的最后一条的 point增加相应的触摸过的坐标
- (void)drawPaletteTouchesMovedWithPonit:(CGPoint)mPoint {FingerDrawLineInfo *lastInfo = [self.allMyDrawPaletteLineInfos lastObject];[lastInfo.linePoints addObject:[NSValue valueWithCGPoint:mPoint]];
}- (void)cleanAllDrawBySelf {if ([self.allMyDrawPaletteLineInfos count]>0)  {[self.allMyDrawPaletteLineInfos removeAllObjects];[self setNeedsDisplay];}
}- (void)cleanFinallyDraw {if ([self.allMyDrawPaletteLineInfos count]>0) {[self.allMyDrawPaletteLineInfos  removeLastObject];}[self setNeedsDisplay];
}

接下来 我们在ViewController中添加一个ImageView 试试看

- (void)viewDidLoad {[super viewDidLoad];// Do any additional setup after loading the view, typically from a nib.imageV = [[UIImageView alloc]initWithFrame:CGRectMake(0, 120, screen_Width, screen_Height-150)];imageV.image = [UIImage imageNamed:@"640-960-1.jpg"];[self.view addSubview:imageV];UIButton *testBtn = [[UIButton alloc]initWithFrame:CGRectMake(screen_Width/2.0-60, 60, 120, 36)];[testBtn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];[testBtn setTitle:@"添加涂鸦" forState:UIControlStateNormal];[testBtn addTarget:self action:@selector(addLineAct:) forControlEvents:UIControlEventTouchUpInside];[self.view addSubview:testBtn];}- (void)addLineAct:(id)sender{NSLog(@"测试按钮");FingerDrawLine *touchdrawView = [[FingerDrawLine alloc]initWithFrame:imageV.frame];touchdrawView.currentPaintBrushColor = [UIColor yellowColor];touchdrawView.currentPaintBrushWidth = 5.0;[self.view addSubview:touchdrawView];}

好了 我们运行项目试试

点击添加涂鸦 

在图片上画一画试试 是不是出来了


好了 这个代码中没有做撤销,和清除涂鸦 但是方法已经写好了 大家有兴趣去自己写写

下节我们讲一讲图片上添加文字 http://blog.csdn.net/lwjok2007/article/details/50896455

源代码我们将上传到群空间

demo:【60314手指涂鸦FingerLine.zip】



苹果开发群 :414319235  欢迎加入,共同学习


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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

html5制作涂鸦板,HTML5实现涂鸦板

最近闲的,看了看html5,强大的绘图功能让我惊奇,于是,写了个小玩意---涂鸦板,能实现功能有:画画,改色,调整画笔大小 html5的绘图可以分为点,线,面,圆,图片等,点和线,这可是所有平面效果的基点,有了这两个东西,没有画不出来的东西,只有想不到的算法。 先上代码了…

Android对长图进行滑动涂鸦

由于项目需要对页面进行像做笔记一样的涂绘&#xff0c;所以这个功能点就应运而生&#xff0c;思路是加载完了页面以后就将整个截屏保存&#xff0c;进入编辑页面就将保存图片的地址传入自定义的长图加载控件中&#xff0c;高度的变化与滑动借助于一个修改过得竖直的seekbar,空…

AndroidStudio实现在图片上涂鸦并记录涂鸦轨迹

AndroidStudio实现在图片上涂鸦&#xff0c;并保存涂鸦轨迹 开个坑&#xff0c;终于有时间整理一下这个项目里用到的比较重要的技术 虽然最后甲方没有采用&#xff08;笑&#xff09; 因为博主学艺不精&#xff0c;有很多小bug AndroidStudio版本&#xff1a;2020.3.1.25 实现效…

仿微信图片编辑软件,涂鸦、裁剪、添加文本等常规操作

1、需求 在做一个野外地质数据采集软件开发的过程中&#xff0c;有时候需要进行拍照保存&#xff0c;在此&#xff0c;我们直接通过Intent调用系统的拍照功能&#xff1b;然后&#xff0c;调用系统的裁剪功能&#xff0c;可以按照需要的大小进行裁剪&#xff1b;但是但是但是。…

iOS 图片涂鸦功能

大致原理&#xff1a; 1.准备几张切图。 2.监听手势&#xff0c;手势开始&#xff0c;随机添加一张图片&#xff1b;手势移动&#xff0c;累加手势距离&#xff0c;到达一定值再添加一张随机图片并清零累加距离&#xff0c;依次类推。 demo地址&#xff1a;https://github.co…

抖音私信名片_抖音消息卡片_抖音跳转微信_抖音私信跳转_抖音落地页

近期见到许多人到求这一的信息卡片个人名片是怎么做的&#xff0c;我四处请人了解&#xff0c;总算找到这一卡片的做法。 这个是抖音内置的作用&#xff0c;它是抖音橱窗的一个作用&#xff0c;沒有开通抖音橱窗是完成不上这一作用的&#xff0c;得下开通橱窗作用&#xff0c;…

AI辅助编程,GitHub copilot chat 体验

最近&#xff0c;看到很多大佬分享 GitHub copilot chat &#xff0c;据说能够让效率翻倍&#xff0c;抱着不相信&#xff0c;打假的心态我也弄一个&#xff0c;体验一下&#xff0c;结果真的很赞&#xff0c;下面分享使用 GitHub copilot chat 的过程 ​ 首先&#xff0c;我们…

工作完三年后,分享分享Java后端开发的一些心得

今年进入我工作的第四个年头, 三年多的时间里, 算上实习, 经历过3家公司. 见过了各种各样的同事, 也算见过各式各样的代码. 这篇文章主要是想分享一下一个java后端三年的一些感悟, 关于编程上的, 工作上的, 和同事相处上的. 一: 关于开发 我把关于编程的写在最前面, 我觉得对于…

打工人都在用的AI工具(第二期)

数量技术宅团队在CSDN学院推出了量化投资系列课程 欢迎有兴趣系统学习量化投资的同学&#xff0c;点击下方链接报名&#xff1a; 量化投资速成营&#xff08;入门课程&#xff09; Python股票量化投资 Python期货量化投资 Python数字货币量化投资 C语言CTP期货交易系统开…

一人改代码搞崩推特,马斯克气疯:全部重写!

鱼羊 丰色 发自 凹非寺量子位 | 公众号 QbitAI “马斯克气疯了”&#xff01; 就在今天&#xff0c;推特又双叒崩溃了&#xff0c;图片和任何链接都打不开。 据马斯克自己的说法&#xff0c;原因只是“API的一个小改动”。 但后果很严重&#xff0c;起码在网友们看来&#xff0…

【真北直播笔记】董越:简明DevOps学习地图

缘起 真北敏捷社区的宗旨是&#xff1a;求知、连接。求知就是学习&#xff0c;家里没矿的话&#xff0c;学习是一个人最重要的动力之源。连接就是把人拉在一起&#xff0c;我们相信人与人的互动会带来美好的变化。今天的直播是把大家拉在一起学习&#xff0c;就是求知、连接。 …

云原生可观测领域的半壁江山,这次被 Grafana 和 Cilium 给拿下了

两个多月前&#xff0c;Grafana 实验室宣布与 Cilium 母公司 Isovalent 建立战略合作伙伴关系[1]&#xff0c;希望通过 Grafana 开源的可观测性全家桶组件&#xff0c;帮助各个基础架构团队深度探测 Kubernetes 集群工作负载的安全、性能和相互之间的连接状况。在这之前&#x…

爽翻!Github Copilot X发布,集成了GPT-4,远不止帮写代码

点击上方“编程技术进阶”&#xff0c;加"星标" 重磅干货&#xff0c;第一时间送达 大家好&#xff0c;我是编哥。今天看到Github Copilot X发布&#xff0c;真的不只帮写代码&#xff0c;不信往下看。 Copilot X 的本事&#xff0c;当你选中一段代码&#xff0c;可以…

AI 告诉你 一行代码生成树形结构

一、前言 在我们日常开发中生成树形结构是无可避免的&#xff0c;比如权限管理的层级结构&#xff0c;学校企业的组织结构以及我们日常开发的菜单列表等等。我最近看到过一篇文章&#xff0c;在面试的过程中&#xff0c;会被要求手写一下如何根据扁平的数据结构生成一个树形结构…

巴比特 | 元宇宙每日必读:AI概念股集体大跌、光年之外卖给美团、ChatGPT也涨不动了,大模型热潮正在降温?创业者如何抉择?...

摘要&#xff1a;据甲子光年报道&#xff0c;在高喊“要做中国版OpenAI”之后的第136天&#xff0c;王慧文把光年之外卖给了美团。从整体商业视角看&#xff0c;光年之外被美团收购只是企业间常见的收购动作。但对于国内AI行业来说&#xff0c;这笔收购似乎预示着仅火热半年的A…

ChatGPT来了,全国百万打工人都慌了......

关注我们丨文末赠书 如果说上个月AIGC的热度还只停留在技术圈&#xff0c;那么最近AIGC的影响力已经辐射到普通打工人了&#xff01; 4月18日&#xff0c;国内办公软件巨头金山正式发布了生成式人工智能应用WPS AI&#xff0c;这也是国内协同办公赛道首个类ChatGPT式应用&#…

BSP按键适配

笔记目录 GPIO按键适配PS&#xff1a;每次修改适配都要再客制化一下,来更新修改。&#xff01;&#xff01;&#xff01;一、GPIO按键适配&#xff08;Rk&#xff09;linux键值二、GPIO适配&#xff1a;RK平台&#xff08;android11&#xff09;调试&#xff1a;1、adb命令打开…

ubuntu和ros安装后的初始化

huanyu机器人学习&#xff0c;要把代码学会 分区规则&#xff1a;以350G左右为例 找到空闲&#xff1a; ext4→efi 逻辑分区 1G ext4→交换空间 逻辑分区 30/32G&#xff08;按照内存选&#xff0c;16G用32&#xff09; 挂载点→ / → 主分区 →100G 挂载点→/usr → 逻辑分区…

AI小作文搞崩科大讯飞股价 科技“魔法”反噬科企

5月24日午后&#xff0c;A股公司科大讯飞的股价突然走出深V造型&#xff0c;闪崩8%。科大讯飞回应称&#xff0c;股价下跌系某生成式AI写作虚假小作文导致&#xff0c;谣传风险为不实消息。 网传的一篇“小作文”谣称“科大讯飞被曝采集用户隐私数据研究人工智能引发争议”&am…

1月安全月报 | 2亿Twitter用户数据被公开;美计划发起“黑掉五角大楼3.0”漏洞赏金计划

目录 国外安全热点 &#x1f449;安全政策 &#x1f449;数据安全 &#x1f449;市场趋势 &#x1f449;勒索事件 国内安全热点 &#x1f449;数据安全 &#x1f449;业务安全 &#x1f449;移动安全 &#x1f449;网安政策 为了让大家更全面的了解网络安全的风险&am…