写在前面

所有功能演示

DDGScreenShot 库提供了截取任意图片的功能,
支持手势截图,当然,输入任意的区域也可以,下面看看具体的代码

代码如下:

方法封装
/**
** 用手势截图(截取图片的任意部分)
- imageView --传图片
- bgView --截图背景
*/
public func shotImage(imageView: UIImageView?,bgView: UIView?) -> UIImage? {
if imageView == nil {
return nil
}
//开启一个位图上下文
UIGraphicsBeginImageContextWithOptions((imageView?.bounds.size)!, false, 0.0)
//用贝塞尔绘制
let path = UIBezierPath(rect: (bgView?.frame)!)
//开始截取
path.addClip()
//把ImageView的内容渲染上下文当中.
let imgectx = UIGraphicsGetCurrentContext()
imageView?.layer.render(in: imgectx!)
//从上下文中得到图片
let newImage = UIGraphicsGetImageFromCurrentImageContext()
//关闭上下文
UIGraphicsEndImageContext()
return newImage
} 异步方法封装
/**
** 异步用手势截图(截取图片的任意部分)
- imageView --传图片
- bgView --截图背景
- parameter completed: 异步完成回调(主线程回调)
*/
public func async_shotImage(imageView: UIImageView?,bgView: UIView?,completed:@escaping (UIImage?) -> ()) -> Void {
DispatchQueue.global().async{
let newImage = self.shotImage(imageView: imageView, bgView: bgView)
DispatchQueue.main.async(execute: {
completed(newImage)
})
}
}

使用代码

        imageView = UIImageView()
self.view.addSubview(imageView!)
imageView?.image = UIImage(named: "0")
imageView?.isUserInteractionEnabled = true
imageView?.frame = CGRect(x: 0, y: 0, width: width, height: height) let pan = UIPanGestureRecognizer(target: self, action: #selector(panTouch(startPan:)))
imageView?.addGestureRecognizer(pan) func setBgView() {
if bgView == nil {
bgView = UIView()
}
self.view.addSubview(bgView!)
bgView?.backgroundColor = UIColor.black
bgView?.alpha = 0.7
} @objc func panTouch(startPan: UIPanGestureRecognizer) {
let shotPan = startPan.location(in: imageView)
//获取起始点
self.setBgView()
if startPan.state == .began {
//获取当前点
self.startPoint = shotPan
} else if startPan.state == .changed {
//获取当前点
let X = startPoint.x
let Y = startPoint.y
let W = shotPan.x - startPoint.x
let H = shotPan.y - startPoint.y
let rect = CGRect(x: X, y: Y, width: W, height: H)
bgView?.frame = rect
} else if startPan.state == .ended { let newImage = DDGManage.share.shotImage(imageView: imageView, bgView: bgView)
bgView?.removeFromSuperview()
bgView = nil
let imageView1 = UIImageView()
self.view.addSubview(imageView1)
imageView1.image = newImage
imageView1.frame = CGRect(x: 100, y: 200, width: 200, height: 200)
}
}
### 这样就可以当手势停止就可以得到相应区域的图片

结束语

大功告成,此代码已经上传到githup[DDGScreenShot](https://github.com/dudongge/DDGScreenShot)
[link](https://github.com/dudongge/DDGScreenShot)
当然这只是这个库的功能的一小部分
想看更多功能,可以去github上下载,如果对您有帮助,希望您不吝给个star.

欢迎查看DDGScreenShot

其余功能如下

  1. (一)DDGScreenShot — 复杂屏幕截屏(如view ScrollView webView wkwebView)
  2. (二)DDGScreenShot--iOS 图片处理--多图片拼接
  3. (三)DDGScreenShot--iOS 图片裁剪,切圆角,加边框,你还用cornerRadius,还有更高级的用法
  4. (四)DDGScreenShot—图片擦除功能
  5. (六)DDGScreenShot —图片加各种滤镜高逼格操作
  6. (七)DDGScreenShot —图片加高斯模糊,老电影效果

DDGScreenShot—截取图片的任意部分的更多相关文章

  1. node上截取图片工具 images(node-images)

    我们经常会遇到服务器上传的图片进行裁剪或者增加logo等等一些操作,在node平台上该如何实现呢? 看到大家都在使用"gm"这个工具,功能很强大,但是在Windows平台上简直就是 ...

  2. IOS 截取图片 部分 并生成新图片

    /** * 从图片中按指定的位置大小截取图片的一部分 * * @param image UIImage image 原始的图片 * @param rect CGRect rect 要截取的区域 * * ...

  3. iOS 根据UIImage 修改UIImageView Frame (包括截取图片中间部分)

    iOS UIImageView 根据需求调整frame 1.图片的宽和高不相等,截取图片的中间部分,截取的部分Size明确 2.图片的宽度要等于其父视图的类的宽度,然后根据宽度计算高度,保证 图片不变 ...

  4. [ATL/WTL]_[0基础]_[CBitmap复制图片-截取图片-平铺图片]

    场景: 1.当你须要截取图片部分区域作为某个控件的背景. 2.须要平铺图片到一个大区域让他自己主动放大时. 3.或者须要合并图片时. 代码: CDC sdc; CDC ddc; sdc.CreateC ...

  5. Unity 截取图片并且显示出来

    Unity 截取图片并且显示出来 近期用到了unity的截图,并且把他显示出来,摸索了很多! 讲解一个东西,android可以存储一些文件在本地,比如配置文件等! 对于不同的系统,方法不一! if ( ...

  6. C# 截取图片区域,并返回所截取的图片

    /// <summary> /// 截取图片区域,返回所截取的图片 /// </summary> /// <param name="SrcImage" ...

  7. 机器学习进阶-图片基本处理-ROI区域 1.img[0:200, 0:200]截取图片 2.cv2.split(对图片的颜色通道进行拆分) 3. cv2.merge(将颜色通道进行合并) 4 cur_img[:, :, 0] = 0 使得b通道的颜色数值为0

    1. 截取图片的部分区域img[0:200, 0:200], 读入的图片是ndarray格式 2. b, g, r = cv2.split(img)  # 对图片的颜色通道进行拆分 3.img = c ...

  8. 关于UIImageView的显示问题——居中显示或者截取图片的中间部分显示

    我们都知道在ios中,每一个UIImageView都有他的frame大小,但是如果图片的大小和这个frame的大小不符合的时候会怎么样呢?在默认情况,图片会被压缩或者拉伸以填满整个区域. 通过查看UI ...

  9. JQuery插件让图片旋转任意角度且代码极其简单 - 摘自网友

    JQuery插件让图片旋转任意角度且代码极其简单 2012-04-01 09:57:03     我来说两句      收藏    我要投稿 引入下方的jquery.rotate.js文件,然后通过$ ...

随机推荐

  1. RabbitMQ消息队列(五):Routing 消息路由

        上篇文章中,我们构建了一个简单的日志系统.接下来,我们将丰富它:能够使用不同的severity来监听不同等级的log.比如我们希望只有error的log才保存到磁盘上. 1. Bindings ...

  2. ubuntu wubi.exe 直接加载下载好的 amd64.tar.xz

    玩了这么久的LINUX,一直都是直机装UBUNTU,虚一下XP的,后来不得不直机用WIN7,只能WUBI装一下UBUNTU了.不得不说,在WIN7下虚一个UBUNTU真是相当麻烦.网络那块很是难搞,而 ...

  3. android自定义listview实现header悬浮框效果

    之前在使用iOS时,看到过一种分组的View,每一组都有一个Header,在上下滑动的时候,会有一个悬浮的Header,这种体验觉得很不错,请看下图: 上图中标红的1,2,3,4四张图中,当向上滑动时 ...

  4. PorterDuffXferMode不正确的真正原因PorterDuffXferMode深入试验)

    菜鸡wing遇敌PorterDuffXferMode,不料过于轻敌,应战吃力.随后与其大战三天三夜,三百余回合不分胜负.幸得 @咪咪控 相助,侥幸获胜. 关键字:PorterDuffXferMode ...

  5. 用C语言实现Ping程序功能

    本文转载自:http://www.ibm.com/developerworks/cn/linux/network/ping/ ping命令是用来查看网络上另一个主机系统的网络连接是否正常的一个工具.p ...

  6. mysql进阶(十二)常见错误汇总

    原因:外键名不能重复

  7. SpriteBuilder实际操作中如何确定合适Breaking force的值

    确定Breaking force合适的值同样很单调,但是按照下面的方法也并不是完全不可能: 输入一个随意的值,比如说100 检查实际场景中关节是否能承受住物理物体,在完美的情况下物理物体将保持静止. ...

  8. LeetCode之“链表”:Reorder List

    题目链接 题目要求: Given a singly linked list L: L0→L1→…→Ln-1→Ln, reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→… You ...

  9. RecyclerView notifyItem闪烁的问题

    之前我们做点赞,用listview做的话,就是在item实现点击后,写一个scal动画,不过现在都转到RecyclerView,那么要做这种效果于是做了一个notifyItemChanged()的操作 ...

  10. cocoa编程第4版 8.5 挑战1 解答

    看似简单,其实也很简单,但开始思路想错了:还上网查了一下,有网友说是将Array Controller的Keys中的personName改为personName.length,好像完全不起作用. 后来 ...