DDGScreenShot--iOS 图片裁剪,切圆角,加边框,你还用cornerRadius,还有更高级的用法
写在前面
所有功能演示


我们肯定做过这样的需求,给一个图片切圆角,
当然我们大多采用简单粗暴的方法
myIcon.layer.cornerRadius = 16.5
myIcon.layer.masksToBounds = true
如果是静态的页面也无关紧要,要是可以滑动的页面,
有很多需要裁剪的图片,那么就要考虑性能了。接下来的方法就是其中一种不错的方法,
此代码已经上传到githup[DDGScreenShot](https://github.com/dudongge/DDGScreenShot)
欢迎查看[DDGScreenShot](https://github.com/dudongge/DDGScreenShot)
当然这只是这个库的功能的一小部分
想看更多功能,可以去github上下载,如果对您有帮助,希望您不吝给个star.
功能代码如下:
具体代码
1,采用UIBezierPath绘制路径的方法
let image = UIImage(named: imageName)
//开启上下文
UIGraphicsBeginImageContext((image?.size)!)
//设置一个圆形的裁剪区域
let path = UIBezierPath(ovalIn: CGRect(x: 0,
y: 0,
width: (image?.size.width)!,
height: (image?.size.height)!))
//把路径设置为裁剪区域(超出裁剪区域以外的内容会被自动裁剪掉)
path.addClip()
//把图片绘制到上下文当中
image?.draw(at: CGPoint.zero)
//从上下文当中生成一张图片
let newImage = UIGraphicsGetImageFromCurrentImageContext()
//关闭上下文
UIGraphicsEndImageContext()
newImage 就是我们需要的图片
可能你会怀疑性能,好,可以,我们放在子线程里进行,代码如下
DispatchQueue.global().async{
//将上述代码发放进去即可
let image = UIImage(named: imageName)
//开启上下文
UIGraphicsBeginImageContext((image?.size)!)
//设置一个圆形的裁剪区域
let path = UIBezierPath(ovalIn: CGRect(x: 0,
y: 0,
width: (image?.size.width)!,
height: (image?.size.height)!))
//把路径设置为裁剪区域(超出裁剪区域以外的内容会被自动裁剪掉)
path.addClip()
//把图片绘制到上下文当中
image?.draw(at: CGPoint.zero)
//从上下文当中生成一张图片
let newImage = UIGraphicsGetImageFromCurrentImageContext()
//关闭上下文
UIGraphicsEndImageContext()
DispatchQueue.main.async(execute: {
//拿到 newImage 到主线程更新UI
completed(newImage)
})
}
似乎已经完美的解决了这个问题,可是截取圆角固定的圆角该怎么办呢,继续往下看,代码如下
/**
** 用异步绘图方式将图片进行任意圆角裁剪
- imageName --传头头像名称
- cornerRadius --传头头像名称
*/
public func tailoringImage(_ imageName: String,withRadius radius: CGFloat) -> UIImage? {
let image = UIImage(named: imageName)
if image == nil {
return UIImage()
}
//开启上下文
UIGraphicsBeginImageContext((image?.size)!)
//设置一个圆形的裁剪区域
let path = UIBezierPath(roundedRect: CGRect(x: 0,
y: 0,
width: (image?.size.width)!,
height: (image?.size.height)!), cornerRadius: radius)
//把路径设置为裁剪区域(超出裁剪区域以外的内容会被自动裁剪掉)
path.addClip()
//把图片绘制到上下文当中
image?.draw(at: CGPoint.zero)
//从上下文当中生成一张图片
let newImage = UIGraphicsGetImageFromCurrentImageContext()
//关闭上下文
UIGraphicsEndImageContext()
return newImage
}
当然也可以在子线程中进行
/**
** 用异步绘图方式将图片进行任意圆角裁剪
- imageName --传头头像名称
- cornerRadius --要设置圆角的大小
- parameter completed: 异步完成回调(主线程回调)
*/
public func async_tailoringImage(_ imageName: String,withRadius radius: CGFloat,completed:@escaping (UIImage?) -> ()) -> Void {
DispatchQueue.global().async{
let newImage = self.tailoringImage(imageName, withRadius: radius)
DispatchQueue.main.async(execute: {
completed(newImage)
})
}
}
//当然你还不满意,因为产品一句:加上个边框吧,总有办法实现,不信,请看代码:
切圆角,加边框
/**
** 绘图方式将图片裁剪成圆角并添加边框
- imageName --传头头像名称
- borderWidth --边框大小
- borderColor --边框颜色
*/
public func tailoringImageLayer(_ image: UIImage,borderWidth width:CGFloat,borderColor color: UIColor ) -> UIImage? {
//1.先开启一个图片上下文 ,尺寸大小在原始图片基础上宽高都加上两倍边框宽度.
let imageSize = CGSize(width: image.size.width + width * 2 , height: image.size.height + width * 2)
UIGraphicsBeginImageContext(imageSize)
//2.填充一个圆形路径.这个圆形路径大小,和上下文尺寸大小一样.
//把大圆画到上下文当中.
let path = UIBezierPath(ovalIn: CGRect(x: 0,
y: 0,
width: imageSize.width,
height: imageSize.height))
//颜色设置
color.set()
//填充
path.fill()
//3.添加一个小圆,小圆,x,y从边框宽度位置开始添加,宽高和原始图片一样大小.把小圆设为裁剪区域.
let clipPath = UIBezierPath(ovalIn: CGRect(x: width, y: width, width: image.size.width, height: image.size.height))
//把小圆设为裁剪区域.
clipPath.addClip()
//4.把图片给绘制上去.
image.draw(at: CGPoint(x: width, y: width))
//5.从上下文当中生成一张图片
let newImage = UIGraphicsGetImageFromCurrentImageContext()
//6.关闭上下文
UIGraphicsEndImageContext()
return newImage
}
/**
** 异步绘图方式将图片裁剪成圆角并添加边框
- imageName --传头头像名称
- borderWidth --边框大小
- borderColor --边框颜色
- parameter completed: 异步完成回调(主线程回调)
*/
public func async_tailoringImageLayer(_ image: UIImage,borderWidth width:CGFloat,borderColor color: UIColor ,completed:@escaping (UIImage?) -> ()) -> Void {
DispatchQueue.global().async{
let newImage = self.tailoringImageLayer(image, borderWidth: width, borderColor: color)
DispatchQueue.main.async(execute: {
completed(newImage)
})
}
}
上图片

结束语
总算大功告成,此代码已经上传到githup[DDGScreenShot](https://github.com/dudongge/DDGScreenShot)
[link](https://github.com/dudongge/DDGScreenShot)
当然这只是这个库的功能的一小部分
想看更多功能,可以去github上下载,如果对您有帮助,希望您不吝给个star.
欢迎查看DDGScreenShot
其余功能如下
- (一)DDGScreenShot — 复杂屏幕截屏(如view ScrollView webView wkwebView)
- (二)DDGScreenShot--iOS 图片处理--多图片拼接
- (三)DDGScreenShot--iOS 图片裁剪,切圆角,加边框,你还用cornerRadius,还有更高级的用法
- (四)DDGScreenShot—图片擦除功能
- (五)DDGScreenShot—截取图片的任意部分
- (六)DDGScreenShot —图片加各种滤镜高逼格操作
- (七)DDGScreenShot —图片加高斯模糊,老电影效果
DDGScreenShot--iOS 图片裁剪,切圆角,加边框,你还用cornerRadius,还有更高级的用法的更多相关文章
- iOS 图片裁剪方法
iOS 图片裁剪方法 通过 CGImage 或 CIImage 裁剪 UIImage有cgImage和ciImage属性,分别可以获得CGImage和CIImage对象.CGImage和CIImage ...
- iOS 图片裁剪 + 旋转
iOS 图片裁剪 + 旋转 之前分别介绍了图片裁剪和图片旋转方法 <iOS 图片裁剪方法> 地址:http://www.cnblogs.com/silence-cnblogs/p/6490 ...
- iOS开发Quzrtz2D 十:圆形图片的绘制以及加边框圆形图片的绘制
一:圆形图片的绘制 @interface ViewController () @property (weak, nonatomic) IBOutlet UIImageView *imageV; @en ...
- ios 图片的两种加载方式
控件加载图片,plist,懒加载,序列帧动画,添加动画效果. IOS中有2种加载图片的方式. 方式一:有缓存(图片所占用的内存会一直停留在程序中) + (UIImage *)imageNamed:(N ...
- iOS 指定位置切圆角不生效问题
如果是在VC中操作,需要在viewDidLayoutSubviews方法里 - (void)viewDidLayoutSubviews { [super viewDidLayoutSubviews]; ...
- IOS 图片阴影,圆角等处理
一直以来,为IOS添加图片的特殊效果都是通过跟美工的配合,比如,要加阴影,就从美工那边获得一张阴影效果图,在界面上画两个UIImageView,将阴影放在下面,图像放上上面,错开一定角度.有比如想做圆 ...
- iOS 图片裁剪与修改
最近做的项目中需要上传头像,发表内容的时候也要涉及到图片上传,我直接用的原图上传,但是由于公司网络差,原图太大,老是加载好久好久,所以需要把原图裁剪或者修改分辨率之后再上传,找了好久,做了很多尝试才解 ...
- ios中设置UIButton圆角,添加边框
//例如: UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; button.frame = CGRectMake(50, ...
- iOS 图片9切
UIImageView *svRect; UIImage *backgroundImage = [UIImage imageNamed:@"bg.png"]; background ...
随机推荐
- hive中与hbase外部表join时内存溢出(hive处理mapjoin的优化器机制)
与hbase外部表(wizad_mdm_main)进行join出现问题: CREATE TABLE wizad_mdm_dev_lmj_edition_result as select * from ...
- MO_GLOBAL - EBS R12 中 Multi Org 设计的深入研究 (2)
这是多组织访问的第二篇文章,翻译自Anil Passi的Multi Org R12 我们都知道,在Oracle Release 12中多组织模型(Multi Org)会被改变, 它被叫作多组织访问控制 ...
- Linux之命令的组合
在Linux下有好多经典的操作,其中尤为经典的是命令的组合,不管是作为参数,还是命令之间的配合,都做得比较完善.下面看一下常用的一些命令吧. 1.连续运行多个命令就可以使用':'作为分隔,但是缺点就是 ...
- 11.2、Libgdx的音频之音乐
(官网:www.libgdx.cn) 对于任何超过5秒的声音来说,最好将其放到磁盘中而不是内存中.Libgdx提供了一个Music接口来帮我们实现. 以下载入Music实例: Music music ...
- PageContext ServletContext ServletConfig辨析
上面三个东西都是什么关系呀? 先看图 注意几点 1 GenericServlet有两个init方法# 2 GenericServlet既实现了ServletConfig方法,它自己由依赖一个Servl ...
- (四十三)UITabBarController和AppDelegate的一些细节
假设一个UITabBar是V1,V2,V3三个视图的根控制器. 一进入程序的时候,只会加载一个视图V1,也就是说UITabBar是延迟加载的. Tip:通过代码创建的UITabBar会一次性加载所有视 ...
- C语言中的sizeof解析
1. 定义:sizeof是C/C++中的一个操作符(operator),作用就是返回一个对象或者类型所占的内存字节数.返回 值类型为size_t,在头文件stddef.h中定义.这是一个依赖于编译系统 ...
- 网站开发进阶(二十九)HTML特殊转义字符
HTML特殊转义字符 参考文献 http://tool.oschina.net/commons?type=2 美文美图
- AWR報告詳解
AWR是Oracle 10g 版本 推出的新特性, 全称叫Automatic Workload Repository-自动负载信息库, AWR 是通过对比两次快照(snapshot)收集到的统计信息 ...
- 广义线性模型 R--glm函数
R语言glm函数学习: [转载时请注明来源]:http://www.cnblogs.com/runner-ljt/ Ljt 作为一个初学者,水平有限,欢迎交流指正. glm函数介绍: glm(for ...