涂鸦demo(swift)

这是一款涂鸦软件,能够实现对图片的基本操作,供大家参考,主要功能点有:

效果图

1.截取长图

该功能的主要原理是截取webview的高度所在的区域,所以这种截屏需要在webview加载完毕后获取到webView.scrollView的contensize,然后将webview的高度设置成这个高度再结合上下文进行截屏操作,注意截屏之后webview的尺寸要恢复成之前的尺寸

// 截取webview所有的内容

func screenShot() -> UIImage {

var image = UIImage()

UIGraphicsBeginImageContextWithOptions(self.webView.scrollView.contentSize, true, 0)

//保存webView当前的偏移量

let savedContentOffset = self.webView.scrollView.contentOffset

let saveFrame = self.webView.scrollView.frame`

//将webView的偏移量设置为(0,0)

self.webView.scrollView.contentOffset = CGPoint(x: 0, y: 0)

self.webView.frame = CGRect(x: 0, y: 0, width:

self.webView.scrollView.contentSize.width, height: self.webView.scrollView.contentSize.height)

//在当前上下文中渲染出webView

self.webView.scrollView.layer.render(in: UIGraphicsGetCurrentContext()!)

//截取当前上下文生成Image

image = UIGraphicsGetImageFromCurrentImageContext()!

//恢复webview的偏移量

self.webView.scrollView.contentOffset = savedContentOffset

self.webView.frame = saveFrame

UIGraphicsEndImageContext()

return image

}

2.画板的封装,能够高高效、方便的实现画板的操作。

这个思路我是参考这篇文章 http://blog.csdn.net/zhangao0086/article/details/43836789 ,他对画板的封装思路很好,大家可以去看一下,不足之处就是图片的缓存搞得有些复杂,我把他的图片缓存逻辑给改了一下。这里主要借鉴他的封装思路。

3.画板的实现

3.1点击第一个页面的编辑进入画板页面,该页面的主要结构是:底层ScrollView,ScrollView上面放置一个DrawBoard(UIimageView)(放置ScrollView的原因是可以随意缩放图片)

新建DrawBoard,继承自UIimageView,这个DrawBoard就是我们的画板,这里面注意一点:我们绘制的图片不是DrawBoard的image属性,而是backgroundColor。

scrollView = UIScrollView()

scrollView.frame = CGRect(x: 0, y: 64, width: KScreenWidth, height: KScreenHeight-50-40-64)

scrollView.showsHorizontalScrollIndicator = false

scrollView.showsVerticalScrollIndicator = false

scrollView.delegate = self

scrollView.minimumZoomScale = 1

scrollView.maximumZoomScale = 10

self.view.addSubview(scrollView!)

drawBoardImageView = DrawBoard.init(frame:scrollView.bounds)

drawBoardImageView.isUserInteractionEnabled = true

// 对长图压缩处理

let scaleImage = UIImage.scaleImage(image: self.editorImage, scaleSize: scrollView.cl_height/self.editorImage.size.height)

drawBoardImageView.backgroundColor = UIColor(patternImage: scaleImage)

scrollView?.addSubview(drawBoardImageView)

3.2 因为截取的是一个长图,所以如果直接设置 drawBoardImageView.backgroundColor = UIColor(patternImage: self.editorImage),就会只显示图片的一部分,所以要对图片进行压缩 。在压缩图片时需要注意一点:图片的大小还是屏幕大小,只是内容压缩,如果图片宽度小于屏幕宽度,图片会平铺铺满整个界面。下面是压缩图片的代码

static func scaleImage(image: UIImage) -> UIImage {

// 画板高度

let boardH = KScreenHeight-64-50-40

// 图片大小 UIScreen.main.scale屏幕密度,不加这个图片会不清晰

UIGraphicsBeginImageContextWithOptions(CGSize(width:KScreenWidth,height:boardH), false, UIScreen.main.scale)

// 真正图片显示的位置

// 图片的宽高比

let picBili: CGFloat = image.size.width/image.size.height

// 画板的宽高比

let boardBili: CGFloat = KScreenWidth/boardH

// 如果图片太长,以高为准,否则以宽为准

if picBili<=boardBili {

image.draw(in: CGRect(x: 0.5*(KScreenWidth-boardH*picBili), y: 0, width: boardH*picBili, height: boardH))

} else {

image.draw(in: CGRect(x: 0, y:0.5*(boardH-KScreenWidth/picBili) , width: KScreenWidth, height: KScreenWidth/picBili))

}

let scaledImage = UIGraphicsGetImageFromCurrentImageContext()

UIGraphicsEndImageContext()

//对图片包得大小进行压缩

let imageData = UIImagePNGRepresentation(scaledImage!)

let m_selectImage = UIImage.init(data: imageData!)

return m_selectImage!

}

3.2 画板的使用和结构

4.马赛克功能

原理:先将要绘制的图片转换成马赛克图片,然后将马赛克图片设置成画笔的颜色就完美实现了马赛克功能。

具体参考demo

5.文本输入功能

思路:手指触摸屏幕时,在屏幕上绘制一个textView,当textView输入结束时,将文字和图片绘制到同一个image中。 绘制的文字同样也支持撤销,橡皮擦等操作

6.DrawBoard类中图片的撤销与前进功能

6.1在DrawBoard类中有一个image的管理类DBUndoManager,主要用于管理我们绘制了多少图片,控制撤销操作和前进操作

6.2DBUndoManager类中的imageArray属性保存着我们每次绘制结束后的image(包括画笔的绘制后的image,文本的输入后的image)

6.3 imageArray存储方法:当用户开始绘制时,先判断是不是最开始的那张图片(没有做任何操作的图片),如果是的,就将imageArray清空,如果不是最初的那张原图,就继续把绘制的image加入到数组中,这里面的逻辑也不复杂,需要认真的理一下。所以,在这里就不多少了,具体看demo,思考!

7.图片的保存

// 返回画板上的图片,用于保存

func takeImage() -> UIImage {

UIGraphicsBeginImageContext(self.bounds.size)

self.backgroundColor?.setFill()

UIRectFill(self.bounds)

self.image?.draw(in: self.bounds)

let image = UIGraphicsGetImageFromCurrentImageContext()

UIGraphicsEndImageContext()

return image!

}

//MARK: - 下载图片

func clickLoadBtn(){

let alertController = UIAlertController(title: "提示", message: "您确定要保存整个图片到相册吗?", preferredStyle: .alert)

let cancelAction = UIAlertAction(title: "取消", style: .cancel, handler: nil)

let okAction = UIAlertAction(title: "确定", style: .default, handler: {

action in

UIImageWriteToSavedPhotosAlbum(self.drawBoardImageView.takeImage(), self, #selector(EditorViewController.image(_:didFinishSavingWithError:contextInfo:)), nil)

})

alertController.addAction(cancelAction)

alertController.addAction(okAction)

self.present(alertController, animated: true, completion: nil)

}

// 保存图片的结果

func image(_ image: UIImage, didFinishSavingWithError error: NSError?, contextInfo:UnsafeRawPointer) {

if let err = error {

UIAlertView(title: "错误", message: err.localizedDescription, delegate: nil, cancelButtonTitle: "确定").show()

} else {

UIAlertView(title: "提示", message: "保存成功", delegate: nil, cancelButtonTitle: "确定").show()

}

}

android 涂鸦软件demo,涂鸦demo(swift)这是一款涂鸦软件,能够实现对图片的基本操作...相关推荐

  1. MATLAB软件禁用利好,Matlab被禁用?一款国产软件站了出来说:我就是中国的Matlab...

    众所周知,前段时间Matlab被禁用,引发了网友们对于国产工业软件落后的诸多思考,比如为什么落后,落后到什么程度,有没有替代品等等. 并且从Matlab到EDA,再到CAD等等,甚至工业操作系统等等, ...

  2. 鸿蒙之始 那个软件能播,智能电视安装这几款直播软件就够了,全是HD画质,还支持回看!...

    很多人在购买了智能电视后,发现智能电视本身是不具备直播功能的.可是每到春晚.元宵等这些重大节日都会有一些晚会的直播,若果没有直播功能,就无法收看这些晚会直播了. 那么如何才能准时观看到这些直播呢,今天 ...

  3. linux 电路版图 设计软件,2020年最新最好用的3款电路图软件

    2020年最新最好用3款的电路图绘制工具进行电路图绘制,一定离不开专业绘图软件的帮助,但对于此类软件,应用市场上也是数不胜数,很多用户可能因为找不到一款适合自己使用的软件而常常感到苦恼,现经使用和测评 ...

  4. notepad++是什么软件_对比国外更优秀的五款国产软件,却不被国人所熟悉

    说到国产软件,大家第一时间应该会想到快播与千千静听,曾经风靡一时,现如今已经无人问津,有点可惜了,下面与大家介绍几款现在比较厉害的国产软件,却不被国人所熟悉!~~ WPS wps是一款国产优秀的办公软 ...

  5. 职场人士都在用的15款办公软件,有你用过的吗?

    作为一名职场打工人,安装过大大小小数十种软件,踩过不少雷花不少冤枉钱,也遇到过不少小众宝藏软件.今天整理出其中最适合职场办公实用的15款神仙软件,希望大家能借助软件,提高自己的生产力,尽快完成工作,准 ...

  6. 无意看到这款小软件:RunAsDate,非常有创意

    [序言] 今日项目告一段落,在网络上闲逛,无意看到一个很独特软件,非常有创意. 软件名: RunAsDate 这个软件的作用是:这软件可以用来无限拓展试用软件的试用时间,而且几乎是全部软件通杀.(备注 ...

  7. 盘点那些不为人知却堪称神器的8款系统管理软件

    现在大部分人都会使用电脑工作.学习,今天小编就来分享8款堪称"神器"的电脑软件.这8款"神器"一般人都不知道,但据说很多大佬都会用它们,咱们即使不用,也要知道这 ...

  8. 图像混合模式:Android Paint Xfermode 使用和demo

    一.setXfermode(Xfermode xfermode) Xfermode国外有大神称之为过渡模式,这种翻译比较贴切但恐怕不易理解,大家也可以直接称之为图像混合模式,因为所谓的"过渡 ...

  9. Android handler Thread 修改UI Demo

    /*********************************************************************** Android handler Thread 修改UI ...

最新文章

  1. js java cookie_JS 打开一个模式窗口,使用Cookie传递一个参数
  2. python应该怎么自学-Python 应该怎么学?
  3. MySQL+Amoeba实现数据库主从复制和读写分离
  4. leetcode剑指 Offer 42. 连续子数组的最大和(动态规划)
  5. 图形驱动程序和显卡驱动什么区别_以后你的手机也需要单独安装显卡驱动程序了...
  6. 知识星球如何升级为正式星球 知识星球怎么创建星球
  7. cgi mysql数据库_Perl CGI中操作Mysql数据库
  8. Arduino笔记-数字输入(开关的正确使用)
  9. 汉字的动态编码与显示方案
  10. whitepages 配合调查_“你好,我是警察!请配合我们的调查......”_政务_澎湃新闻...
  11. winform画图 抗锯齿
  12. matlab画图函数基本使用(适合新手)
  13. solidworks电气元件3d库_丨部件库丨西门子3RV6电机保护开关
  14. 四月一个晴朗的早晨,遇见一个百分之百的女孩 作者:村上春树
  15. [html+css+js] 小米官网首页制作
  16. 京东获取商品历史价格信息 API
  17. 企业邮箱是什么?企业邮箱有什么好处?企业邮箱域名怎么设置?
  18. mv150us无线网卡驱动linux,水星MW150US2.0驱动-水星MW150US无线网卡驱动下载v2.0 官方最新版-西西软件下载...
  19. 详解冬奥冠军背后的AI黑科技
  20. 云服务器 架设传奇_阿里云虚拟主机,ECS服务器,轻量应用服务器有什么区别,该如何选择?...

热门文章

  1. mysql procedure 存储过程
  2. node-sass sass-loader版本对应问题
  3. Android消息机制(Handler机制) - 线程的等待和唤醒
  4. Quartus II IP生成报错
  5. Oracle基础包之DBMS_RLS(八)
  6. 笔记本电脑没有wifi图标无法连接无线
  7. Excel图表:随心所欲模拟坐标轴
  8. FPGA的PS还有什么PL是什么意思
  9. 大数据技术之 Flume
  10. Unity Shaders and Effects Cookbook (2-7)实现 Photoshop 色阶效果