我们将这个涂鸦的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以及保存涂鸦图片的代码相关推荐

  1. 使用ffmpeg将BMP图片编码为x264视频文件,将H264视频保存为BMP图片,yuv视频文件保存为图片的代码

    ffmpeg开源库,实现将bmp格式的图片编码成x264文件,并将编码好的H264文件解码保存为BMP文件. 实现将视频文件yuv格式保存的图片格式的测试,图像格式png,jpg, gif等等测试均O ...

  2. framebuffer 保存 bmp图片格式

    最近需要完成一个从framebuffer中进行读取,然后将内存的东西保存为bmp图片格式,我的其他博客内容对framebuffer进行详细的讲解,以及bmp的格式进行详细的讲解. 之前从网上看到了一些 ...

  3. java 视频抽帧_opencv3.2.0实现视频抽帧,并保存成图片

    .实现指定帧数的抽取.和全部帧数的抽取,并保存到指定目录. 在QT新建一个控制台程序,程序源码如下:(程序实现每十帧获取一次帧) #include #include #include #include ...

  4. WPF将Ui保存为图片和保存位图

    WPF将Ui保存为图片 SaveWindowContent(this, "c:\tmp.bmp"); private void SaveWindowContent(Window s ...

  5. android手写汉字,Android 手写输入的实现(保存涂鸦文字)

    Android 提供了很多丰富.实用而且很有特色的功能.比如,语音识别.手写签名等等.本篇就为你介绍如何在android上进行个性化的手写签名. 首先大致说说需求:这是一个追求时尚.张扬个性的时代,我 ...

  6. matlab 动态存储图片,利用matlab创建动态图并保存为AVI格式

    利用matlab创建动态图并保存为AVI格式. MATLAB中,创建电影动画的过程分为以下四步: step1:调用moviein函数对内存进行初始化(该步骤在Matlab5.3以上均可省略),创建一个 ...

  7. 对相机所看的视角截屏保存为图片

    对相机所看的视角截屏保存为图片: 1 using UnityEngine; 2 using System.Collections; 3 using UnityEngine.UI; 4 /// < ...

  8. Unity编辑器扩展-生成prefab的预览图并保存为图片

    Project视图里的prefab文件都是一个蓝色的正方体,我想给它们加个预览图,暂时不知道怎么改Project视图的,但反正我想像NGUI那样有个专门的窗口存放一些常用的prefab,所以做成了如下 ...

  9. html5 保存图片,H5 dom元素保存为图片

    具体代码: 1.html 2.js //创建一个新的canvas var canvas2 = document.createElement("canvas"); let _canv ...

最新文章

  1. C 语言编程 — typedef 关键字
  2. maven打包不打lib目录里面的jar包解决办法
  3. 蒙提霍尔悖论(三门问题)终极分析(补充)附完整源码
  4. 多种方法实现自适应布局
  5. 挑战iOS!小米全新OS发布:22款机型首发
  6. automaticallyAdjustsScrollViewInsets 标签栏不正常显示
  7. 微软职位内部推荐-Software Engineer
  8. rsync+rsync+crond备份
  9. memcached学习(5). memcached的应用和兼容程序
  10. elastic-job调度任务分析
  11. Java--汽车之家论坛反爬虫破解
  12. html a标签属性 rel=‘nofollow‘
  13. 两轮差速机器人ROS下速度解算
  14. 不要嫌我啰嗦~继续话痨python
  15. 后端框架flask学习小记
  16. MM32F3277空闲中断+DMA接收不定长数据
  17. h5 修改title 微信_h5制作小程序 邀请函模板免费
  18. idea中js函数中使用EL表达式报错expression expected以及参数underfined的问题.md
  19. ecshop后台首页mysql_ecshop 添加后台页面以及设置权限
  20. Fighting Girl——那个IT女孩

热门文章

  1. 转:JArray 查寻指定对象, jarray 取值
  2. WHO is Bing? Tech.Ed带来有求“必应”
  3. 音乐人解密:究竟是如何一步一步成为音乐人的?
  4. 进入农业新天地,VR全景农业园展现农产品的生活
  5. Raspberry Pi 4 Model B(4G RAM)WIndows 10 安装(SD挂载USB驱动)
  6. 中国山地车哪个品牌好全球十大户外运动自行车品牌排行榜
  7. C# 实现HttpGet请求
  8. PHP 调用并执行 Linux 命令
  9. 基于python完成大华摄像头对货车逆行实时检查的二次开发
  10. Ubuntu 美化系统为Mac