裁剪加边框
- (void)viewDidLoad {
[super viewDidLoad];
UIImage *image = [UIImage imageNamed:@"add"];
CGSize size = CGSizeMake(image.size.width+2*5, image.size.height+2*5);
//开启上下文
UIGraphicsBeginImageContextWithOptions(size, NO, 0);
//设置背景图
UIBezierPath *path = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(0, 0, size.width, size.height)];
[[UIColor redColor] setFill];
[path fill];
//设置裁剪的图片
UIBezierPath *path_two = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(5, 5, image.size.height, image.size.height)];
//实现裁剪
[path_two addClip];
//把图片绘制到上下文中
[image drawAtPoint:CGPointMake(5, 5)];
//从上下文中取出图片
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
//关闭上下文
UIGraphicsEndImageContext();
self.imageView.image = newImage;
}
效果图:裁剪+设置边框.png
模拟屏幕截图
点击viewController的view会在桌面生成一张view的图片
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
//把控制器的view生成一张图片
//开启一个与当前控制器的view一样大小的上下文尺寸
UIGraphicsBeginImageContextWithOptions([UIScreen mainScreen].bounds.size, NO, 0);
//把控制器的view绘制到上下文当中
//只能通过render的渲染的方式,用draw的方法画不出效果
CGContextRef ctx = UIGraphicsGetCurrentContext();
[self.view.layer renderInContext:ctx];
//从上下文当中获取图片
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
// 把生成的图片写入电脑做面(文件方式的传输:二进制NSData)
NSData *data = UIImagePNGRepresentation(image);
//或者
//第二个参数设置为1则呈现的像素比较全面
// NSData *data = UIImageJPEGRepresentation(image, 1);
[data writeToFile:@"/Users/apple/Desktop/view.png"
atomically:YES];
}
桌面:桌面生成屏幕截图.png
伸缩截图
//懒加载
- (UIImageView *)coverView{
if(!_coverView){
UIImageView *imageView = [[UIImageView alloc] init];
imageView.backgroundColor = [UIColor blackColor];
imageView.alpha = 0.5;
_coverView = imageView;
[self.view addSubview:_coverView];
}
return _coverView;
}
- (void)viewDidLoad {
[super viewDidLoad];
//注意改变imageView的UserInteractionEnabled
self.imageView.userInteractionEnabled = YES;
}
- (IBAction)panAction:(UIPanGestureRecognizer *)sender {
CGPoint startPoint = [sender locationInView:self.imageView];
if(sender.state == UIGestureRecognizerStateBegan){
self.startPoint = startPoint;
}else if(sender.state == UIGestureRecognizerStateChanged){
CGPoint curPoint = [sender locationInView:self.imageView];
//计算相对位移
CGFloat sx = curPoint.x - self.startPoint.x;
CGFloat sy = curPoint.y - self.startPoint.y;
self.coverView.frame = CGRectMake(self.startPoint.x, self.startPoint.y, sx, sy);
}else if (sender.state == UIGestureRecognizerStateEnded){
UIGraphicsBeginImageContextWithOptions(self.imageView.frame.size, NO, 0);
UIBezierPath *path = [UIBezierPath bezierPathWithRect:self.coverView.frame];
[path addClip];
CGContextRef ctx = UIGraphicsGetCurrentContext();
[self.imageView.layer renderInContext:ctx];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
self.imageView.image = image;
[self.coverView removeFromSuperview];
}
}
效果图:伸缩裁剪.gif
擦除图片
实现关键方法
CGContextClearRect(ctx, rect);
- (void)pan:(UIPanGestureRecognizer *)sender {
if(sender.state == UIGestureRecognizerStateChanged){
//获取擦除的方框的rect
CGFloat rectWH = 30;
CGPoint curPoint = [sender locationInView:self.imageView];
CGFloat curX = curPoint.x - 15;
CGFloat curY = curPoint.y - 15;
CGRect rect = CGRectMake(curX, curY, rectWH, rectWH);
//绘制图片
UIGraphicsBeginImageContextWithOptions(self.imageView.frame.size, NO, 0);
CGContextRef ctx = UIGraphicsGetCurrentContext();
//把imageView渲染到上下文中
[self.imageView.layer renderInContext:ctx];
CGContextClearRect(ctx, rect);
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
self.imageView.image = newImage;
}
}
效果图:擦除图片.png