关于创建涂鸦UI以及保存涂鸦图片的代码
我们将这个涂鸦的UI命名为EditImageView,继承UIView。
初始化的时候,直接将EditImageView加到图上,做一下尺寸处理。
_image = [UIImageimageNamed:@"test.jpg"];
float rate = _image.size.width /_image.size.height;
if (rate >= 1.0) {
drawFrame.origin.x=0.0;
drawFrame.size.width =ceilf(CGRectGetWidth(self.view.frame)); //记住这里一定要将无限小数取整。。。否则每次计算重绘都会有神奇的渐变效果
drawFrame.size.height =ceilf(CGRectGetWidth(self.view.frame)/rate);
drawFrame.origin.y =ceilf((CGRectGetHeight(self.view.frame) -CGRectGetHeight(drawFrame))/2.0);
}
else {
drawFrame.origin.y =0.0;
drawFrame.size.height =ceilf(CGRectGetHeight(self.view.frame));
drawFrame.size.width =ceilf(CGRectGetHeight(self.view.frame)/rate);
drawFrame.origin.x =ceilf((CGRectGetWidth(self.view.frame) -CGRectGetWidth(drawFrame))/2.0);
}
UIImageView *imageView = [[UIImageViewalloc] initWithFrame:drawFrame];
imageView.image = _image;
imageView.userInteractionEnabled =YES;
[self.view addSubview:imageView];
GUODrawView *drawView = [[GUODrawViewalloc] initWithFrame:imageView.boundsimage:_image];
drawView.backgroundColor = [UIColorclearColor];
[imageView addSubview:drawView];
这里是EditImageView里边的核心代码
#pragma mark - 事件处理
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
previousPoint = [[touchesanyObject] locationInView:self];
}
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
currentPoint = [[touchesanyObject] locationInView:self];
[selfhandleTouches];
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
currentPoint = [[touchesanyObject] locationInView:self];
[selfhandleTouches];
}
- (void)drawRect:(CGRect)rect
{
[_paintedImage drawInRect:rect];
}
#pragma mark - 私有函数
- (void)handleTouches
{
//创建一个基于位图的上下文并作为当前上下文
UIGraphicsBeginImageContextWithOptions(self.bounds.size,NO, [UIScreenmainScreen].scale);
CGContextRef context =UIGraphicsGetCurrentContext();
//在当前图形上下文中绘制
[_paintedImage drawInRect:self.bounds];
//设置绘制属性,线条笔锋形状、宽度、颜色
CGContextSetLineCap(context,kCGLineCapRound);
CGContextSetLineWidth(context,_lineWidth);
if (_editMode ==GPEditMode_Paint) {
CGContextSetStrokeColorWithColor(context,_strokeColor.CGColor);
}
else {
CGContextSetBlendMode(context,kCGBlendModeClear);
}
//在上下文中创建一条路径
CGContextBeginPath(context);
//设置子路径起点
CGContextMoveToPoint(context,previousPoint.x,previousPoint.y);
//在上个点跟这个点之间添加一段直线
CGContextAddLineToPoint(context,currentPoint.x,currentPoint.y);
//在当前路径上绘制直线
CGContextStrokePath(context);
//当前图形上下文中获取图片
_paintedImage =UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
//重绘整个视图
[selfsetNeedsDisplay];
previousPoint = currentPoint;
}
//合成照片
- (UIImage *)composeOriginImage:(UIImage *)originImage withPaintedImage:(UIImage *)paintedImage inRect:(CGRect)rect
{
if (!originImage || !paintedImage) {
return nil;
}
UIGraphicsBeginImageContextWithOptions(rect.size,NO, [UIScreenmainScreen].scale);
[originImage drawInRect:rect];
[paintedImage drawInRect:rect];
UIImage *composedImage =UIGraphicsGetImageFromCurrentImageContext();
NSLog(@"---originImage:%lu paintedImage:%lu composedImage:%lu", (unsignedlong)UIImageJPEGRepresentation(originImage,1.0).length, (unsignedlong)UIImageJPEGRepresentation(paintedImage,1.0).length, (unsignedlong)UIImageJPEGRepresentation(composedImage,1.0).length);
UIGraphicsEndImageContext();
return composedImage;
}
关于创建涂鸦UI以及保存涂鸦图片的代码相关推荐
- 使用ffmpeg将BMP图片编码为x264视频文件,将H264视频保存为BMP图片,yuv视频文件保存为图片的代码
ffmpeg开源库,实现将bmp格式的图片编码成x264文件,并将编码好的H264文件解码保存为BMP文件. 实现将视频文件yuv格式保存的图片格式的测试,图像格式png,jpg, gif等等测试均O ...
- framebuffer 保存 bmp图片格式
最近需要完成一个从framebuffer中进行读取,然后将内存的东西保存为bmp图片格式,我的其他博客内容对framebuffer进行详细的讲解,以及bmp的格式进行详细的讲解. 之前从网上看到了一些 ...
- java 视频抽帧_opencv3.2.0实现视频抽帧,并保存成图片
.实现指定帧数的抽取.和全部帧数的抽取,并保存到指定目录. 在QT新建一个控制台程序,程序源码如下:(程序实现每十帧获取一次帧) #include #include #include #include ...
- WPF将Ui保存为图片和保存位图
WPF将Ui保存为图片 SaveWindowContent(this, "c:\tmp.bmp"); private void SaveWindowContent(Window s ...
- android手写汉字,Android 手写输入的实现(保存涂鸦文字)
Android 提供了很多丰富.实用而且很有特色的功能.比如,语音识别.手写签名等等.本篇就为你介绍如何在android上进行个性化的手写签名. 首先大致说说需求:这是一个追求时尚.张扬个性的时代,我 ...
- matlab 动态存储图片,利用matlab创建动态图并保存为AVI格式
利用matlab创建动态图并保存为AVI格式. MATLAB中,创建电影动画的过程分为以下四步: step1:调用moviein函数对内存进行初始化(该步骤在Matlab5.3以上均可省略),创建一个 ...
- 对相机所看的视角截屏保存为图片
对相机所看的视角截屏保存为图片: 1 using UnityEngine; 2 using System.Collections; 3 using UnityEngine.UI; 4 /// < ...
- Unity编辑器扩展-生成prefab的预览图并保存为图片
Project视图里的prefab文件都是一个蓝色的正方体,我想给它们加个预览图,暂时不知道怎么改Project视图的,但反正我想像NGUI那样有个专门的窗口存放一些常用的prefab,所以做成了如下 ...
- html5 保存图片,H5 dom元素保存为图片
具体代码: 1.html 2.js //创建一个新的canvas var canvas2 = document.createElement("canvas"); let _canv ...
最新文章
- C 语言编程 — typedef 关键字
- maven打包不打lib目录里面的jar包解决办法
- 蒙提霍尔悖论(三门问题)终极分析(补充)附完整源码
- 多种方法实现自适应布局
- 挑战iOS!小米全新OS发布:22款机型首发
- automaticallyAdjustsScrollViewInsets 标签栏不正常显示
- 微软职位内部推荐-Software Engineer
- rsync+rsync+crond备份
- memcached学习(5). memcached的应用和兼容程序
- elastic-job调度任务分析
- Java--汽车之家论坛反爬虫破解
- html a标签属性 rel=‘nofollow‘
- 两轮差速机器人ROS下速度解算
- 不要嫌我啰嗦~继续话痨python
- 后端框架flask学习小记
- MM32F3277空闲中断+DMA接收不定长数据
- h5 修改title 微信_h5制作小程序 邀请函模板免费
- idea中js函数中使用EL表达式报错expression expected以及参数underfined的问题.md
- ecshop后台首页mysql_ecshop 添加后台页面以及设置权限
- Fighting Girl——那个IT女孩
热门文章
- 转:JArray 查寻指定对象, jarray 取值
- WHO is Bing? Tech.Ed带来有求“必应”
- 音乐人解密:究竟是如何一步一步成为音乐人的?
- 进入农业新天地,VR全景农业园展现农产品的生活
- Raspberry Pi 4 Model B(4G RAM)WIndows 10 安装(SD挂载USB驱动)
- 中国山地车哪个品牌好全球十大户外运动自行车品牌排行榜
- C# 实现HttpGet请求
- PHP 调用并执行 Linux 命令
- 基于python完成大华摄像头对货车逆行实时检查的二次开发
- Ubuntu 美化系统为Mac