最近项目中用到了自定义图片裁剪区域的图片裁剪功能,自己写了一个,可能有诸多不完善的地方,请大家指正。

支持任意区域裁剪,9:16裁剪、16:9裁剪、1:1裁剪、圆形裁剪等等,总之裁剪框的大小,裁剪框的区域都自定义;

如下截图:

整体思路:

1.利用scrollview的zoom缩放功能,缩放对象是所需裁剪图片的imageView;
2.利用scrollView的contentInset参数,保证裁剪图片在裁剪框内,并且可以裁剪图片任意位置;
3.坐标转换找出裁剪区域对应的在图片中的位置,进行图片的渲染裁剪。

使用方法
    LZImageCropping *imageBrowser = [[LZImageCropping alloc]init];//设置代理imageBrowser.delegate = self;//设置自定义裁剪区域大小imageBrowser.cropSize = CGSizeMake(self.view.frame.size.width - 60, (self.view.frame.size.width-60));//设置图片NSString *path = [[NSBundle mainBundle] pathForResource:@"IMG_1121"  ofType:@"jpg"];UIImage *image = [UIImage imageWithContentsOfFile:path];cropper.image = image;//是否需要圆形imageBrowser.isRound = YES;[self presentViewController:imageBrowser animated:YES completion:nil];

以下为关键代码

二、自定义矩形遮罩 圆形遮罩 处理

透明区域是用了两条贝塞尔曲线,第一条是整个灰色区域,然后第二条是需要透明的区域。将第二条附加的第一条上,并且设置填充规则为:

shapeLayer.fillRule = kCAFillRuleEvenOdd;

矩形遮罩
//矩形裁剪区域
- (void)transparentCutSquareArea{//圆形透明区域UIBezierPath *alphaPath = [UIBezierPath bezierPathWithRect:CGRectMake(0, 0, _selfWidth, _selfHeight)];UIBezierPath *squarePath = [UIBezierPath bezierPathWithRect:_cropFrame];[alphaPath appendPath:squarePath];CAShapeLayer *shapeLayer = [CAShapeLayer layer];shapeLayer.path = alphaPath.CGPath;shapeLayer.fillRule = kCAFillRuleEvenOdd;self.overLayView.layer.mask = shapeLayer;//裁剪框UIBezierPath *cropPath = [UIBezierPath bezierPathWithRect:CGRectMake(_cropFrame.origin.x-1, _cropFrame.origin.y-1, _cropFrame.size.width+2, _cropFrame.size.height+2)];CAShapeLayer *cropLayer = [CAShapeLayer layer];cropLayer.path = cropPath.CGPath;cropLayer.fillColor = [UIColor whiteColor].CGColor;cropLayer.strokeColor = [UIColor whiteColor].CGColor;[self.overLayView.layer addSublayer:cropLayer];
}
圆形裁剪遮罩
//圆形裁剪区域
-(void)transparentCutRoundArea{CGFloat arcX = _cropFrame.origin.x + _cropFrame.size.width/2;CGFloat arcY = _cropFrame.origin.y + _cropFrame.size.height/2;CGFloat arcRadius;if (_cropSize.height > _cropSize.width) {arcRadius = _cropSize.width/2;}else{arcRadius  = _cropSize.height/2;}//圆形透明区域UIBezierPath *alphaPath = [UIBezierPath bezierPathWithRect:CGRectMake(0, 0, _selfWidth, _selfHeight)];UIBezierPath *arcPath = [UIBezierPath bezierPathWithArcCenter:CGPointMake(arcX, arcY) radius:arcRadius startAngle:0 endAngle:2*M_PI clockwise:NO];[alphaPath appendPath:arcPath];CAShapeLayer  *layer = [CAShapeLayer layer];layer.path = alphaPath.CGPath;layer.fillRule = kCAFillRuleEvenOdd;self.overLayView.layer.mask = layer;//裁剪框UIBezierPath *cropPath = [UIBezierPath bezierPathWithArcCenter:CGPointMake(arcX, arcY) radius:arcRadius+1 startAngle:0 endAngle:2*M_PI clockwise:NO];CAShapeLayer *cropLayer = [CAShapeLayer layer];cropLayer.path = cropPath.CGPath;cropLayer.strokeColor = [UIColor whiteColor].CGColor;cropLayer.fillColor = [UIColor whiteColor].CGColor;[self.overLayView.layer addSublayer:cropLayer];
}

三、裁剪图片

裁剪矩形图片
-(UIImage *)getSubImage{//裁剪区域在原始图片上的位置CGRect myImageRect = CGRectMake(leftTopPoint.x * scaleRatio, leftTopPoint.y*scaleRatio, width, height);//裁剪图片CGImageRef imageRef = self.image.CGImage;CGImageRef subImageRef = CGImageCreateWithImageInRect(imageRef, myImageRect);UIGraphicsBeginImageContext(myImageRect.size);CGContextRef context = UIGraphicsGetCurrentContext();CGContextDrawImage(context, myImageRect, subImageRef);UIImage* smallImage = [UIImage imageWithCGImage:subImageRef];CGImageRelease(subImageRef);UIGraphicsEndImageContext();//是否需要圆形图片if (self.isRound) {//将图片裁剪成圆形smallImage = [self clipCircularImage:smallImage];}return smallImage;
}
裁剪圆形图片
//将图片裁剪成圆形
-(UIImage *)clipCircularImage:(UIImage *)image{CGFloat arcCenterX = image.size.width/ 2;CGFloat arcCenterY = image.size.height / 2;UIGraphicsBeginImageContext(image.size);CGContextRef context = UIGraphicsGetCurrentContext();CGContextBeginPath(context);CGContextAddArc(context, arcCenterX, arcCenterY, image.size.width/2, 0.0, 2*M_PI, NO);CGContextClip(context);CGRect myRect = CGRectMake(0 , 0, image.size.width ,  image.size.height);[image drawInRect:myRect];UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();UIGraphicsEndImageContext();return  newImage;
}

最后

代码很简单,大家自己的需求可以直接在demo里面修改,具体代码详见github,帮助到你的话,可以随手给个星星哦!
代码: https://github.com/FirstStepzz/LZImageCropping.git

iOS自定义裁剪区域,正方形圆形图片头像裁剪,仿QQ头像裁剪,圆形遮罩,矩型遮罩相关推荐

  1. android人脸识显示头像自定义,Android 仿QQ头像自定义截取功能

    看了Android版QQ的自定义头像功能,决定自己实现,随便熟悉下android绘制和图片处理这一块的知识. 先看看效果: 思路分析: 这个效果可以用两个View来完成,上层View是一个遮盖物,绘制 ...

  2. android 高仿qq,Android高仿QQ头像截取

    花费了半天时间,把 仿QQ头像截取的方法整理了下,并制作了一个demo以供大家参考,基本上实现了qq中我的资料界面上(包括背景透明化,上滑标题栏显示,下拉隐藏等)的大致效果,先上图看效果吧: 支持的功 ...

  3. Android:高仿QQ头像截取

    花费了半天时间,把 仿QQ头像截取的方法整理了下,并制作了一个demo以供大家参考,基本上实现了qq中我的资料界面上(包括背景透明化,上滑标题栏显示,下拉隐藏等)的大致效果,先上图看效果吧: 支持的功 ...

  4. 安卓高仿QQ头像截取升级版

    观看此篇文章前,请先阅读上篇文章:高仿QQ头像截取: 本篇之所以为升级版,是在截取头像界面添加了与qq类似的阴影层(裁剪区域以外的部分),且看效果图:   为了适应大家不同需求,这次打了两个包,及上图 ...

  5. Android:高仿QQ头像截取升级版

    观看此篇文章前,请先阅读上篇文章:高仿QQ头像截取: 本篇之所以为升级版,是在截取头像界面添加了与qq类似的阴影层(裁剪区域以外的部分),且看效果图:   为了适应大家不同需求,这次打了两个包,及上图 ...

  6. 仿QQ头像透明圆图剪切(CAShapeLayer 和 UIBezierPath的使用)

    最近,研究了一下仿QQ头像透明圆图剪切,参考了一下code4App上一位大神的源码. 下面,把一些具体的思路写下来以助记忆,毕竟好记性不如烂笔头. 首先,用到了CAShapeLayer 和 UIBez ...

  7. 自定义圆形ImageView(仿QQ头像)

    我们可以发现,现在的app对圆形图片的使用越来越普遍,特别是用户的头像等.圆形图片外观柔和.友好.饱满,能大大提升用户的视觉体验.所以今天我们就来看看怎样自定义圆形的ImageView(一些说明与应该 ...

  8. 仿QQ头像自定义截取功能

    看了android版QQ的自定义头像功能,决定自己实现,随便熟悉下android绘制和图片处理这一块的知识. 先看看效果: 思路分析: 这个效果可以用两个View来完成,上层View是一个遮盖物,绘制 ...

  9. html圆形图片切换,jQuery和CSS3炫酷圆形图片切换特效

    这是一款效果非常酷的jQuery和CSS3圆形图片切换特效.该圆形图片特效可以使用animate.css来制作图片的进入动画和离开动画.可以任意设置多张图片进行来回翻转.旋转切换,效果堪称一流. 使用 ...

最新文章

  1. 除了密钥,公有云还有哪些安全保护方式
  2. html中的保存功能代码怎么写,java保存html代码怎么写
  3. Webpack实战(一):基础入门-教你轻松搞定Webpack打包工具安装及参数配置
  4. 花音机器人_【扑杀花音攻略组】超弩级光机器人攻略
  5. 【sklearn】有关数据归一化小结---fit_transform、fit、transform区别及其简单使用
  6. LAMP平台部署及应用(二) 安装Discuz!论坛系统
  7. 2018年数学建模竞赛-高温作业专用服装设计
  8. 计算机软件评估资料,软件项目工作量评估方法 计算机软件及应用 IT计算机 专业资料.doc...
  9. 产品选型“神器” TIA Selection Tools 之选择 S7-1500T 全程详解
  10. 【计算机图形学02】b-spline(b-样条曲线)
  11. 使用pdfFactory Pro虚拟打印机给文档加上水印
  12. 【kali技巧】kali配置ssh服务
  13. STC8A8K64D4(51系列单片机)printf打印数据异常的问题
  14. python爬虫之抓取高清壁纸
  15. 免费使用腾讯云每天定时签到京东领取京豆
  16. python合并word表格_python合并word
  17. DIY钢铁侠电动开合
  18. 使用cmd命令窗口打开对应的应用程序
  19. ES 索引创建及查询
  20. mac 连接windows远程桌面软件Parallels Client

热门文章

  1. stm32f103驱动SHT20( I2C )
  2. 一篇带你了解让你的眼睛写代码!Opencv实时眼球追踪,解脱的你双手!
  3. 单片机上的8位数码管同时显示数字“12345678“
  4. 秒懂Java代理与动态代理模式
  5. 基于圣邦微SGM41526多节锂电池充放电电源管理电路分析
  6. scrt连接不到centos系统的解决办法
  7. flink kafka报错Timeout of 60000ms expired before the position for partition could be determined
  8. 【面试大全-缓存】-Redis有哪些适合的场景
  9. SPN/MTN标准及其进展是什么情况?
  10. 【数据结构】栈和队列的相同点和不同点