源码0301-图片水印-裁剪-截屏-截取-擦除
// ViewController.m // 01-图片水印 #import "ViewController.h" // 在图片的基础绘制一些文字或者Logo,最终生成一张图片 @interface ViewController () @property (weak, nonatomic) IBOutlet UIImageView *imageView; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. // 加载图片 UIImage *image = [UIImage imageNamed:@"小黄人"]; // 0.获取上下文,之前的上下文都是在view的drawRect方法中获取(跟View相关联的上下文layer上下文) // 目前我们需要绘制图片到新的图片上,因此需要用到位图上下文 // 怎么获取位图上下文,注意位图上下文的获取方式跟layer上下文不一样。位图上下文需要我们手动创建。 // 开启一个位图上下文,注意位图上下文跟view无关联,所以不需要在drawRect. // size:位图上下文的尺寸(新图片的尺寸) // opaque: 不透明度 YES:不透明 NO:透明,通常我们一般都弄透明的上下文 // scale:通常不需要缩放上下文,取值为0,表示不缩放 UIGraphicsBeginImageContextWithOptions(image.size, NO, 0); // 1.获取上下文(位图上下文) CGContextRef ctx = UIGraphicsGetCurrentContext(); // 2.描述路径 CGContextMoveToPoint(ctx, 50, 50); CGContextAddLineToPoint(ctx, 200, 200); [[UIColor redColor] set]; // 3.渲染上下文 CGContextStrokePath(ctx); // UIBezierPath *path =[UIBezierPath bezierPathWithOvalInRect:CGRectMake(0, 0, 300, 300)]; // // [[UIColor redColor] set]; // [path stroke]; // // 1.绘制原生的图片 // [image drawAtPoint:CGPointZero]; // // // 2.给原生的图片添加文字 // NSString *str = @"小码哥"; // // // 创建字典属性 // NSMutableDictionary *dict = [NSMutableDictionary dictionary]; // dict[NSForegroundColorAttributeName] = [UIColor redColor]; // dict[NSFontAttributeName] = [UIFont systemFontOfSize:20]; // // [str drawAtPoint:CGPointMake(200, 528) withAttributes:dict]; // 3.生成一张图片给我们,从上下文中获取图片 UIImage *imageWater = UIGraphicsGetImageFromCurrentImageContext(); // 4.关闭上下文 // UIGraphicsEndImageContext(); _imageView.image = imageWater; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end
02-图片裁剪
// ViewController.m // 02-图片裁剪 #import "ViewController.h" #import "UIImage+Image.h" @interface ViewController () @property (weak, nonatomic) IBOutlet UIImageView *imageView; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. // 图片裁剪:把正方形图片重新生产一张圆形的图片 // 图片裁剪 UIImage *image = [UIImage imageWithClipImage:[UIImage imageNamed:@"阿狸头像"] borderWidth:1 borderColor:[UIColor redColor]]; _imageView.image = image; } - (void)clipImage { // 0.加载图片 UIImage *image = [UIImage imageNamed:@"阿狸头像"]; // 1.开启位图上下文,跟图片尺寸一样大 UIGraphicsBeginImageContextWithOptions(image.size, NO, 0); // 2.设置圆形裁剪区域,正切与图片 // 2.1创建圆形的路径 UIBezierPath *path = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(0, 0, image.size.width, image.size.height)]; // 2.2把路径设置为裁剪区域 [path addClip]; // 3.绘制图片 [image drawAtPoint:CGPointZero]; // 4.从上下文中获取图片 UIImage *clipImage = UIGraphicsGetImageFromCurrentImageContext(); // 5.关闭上下文 UIGraphicsEndImageContext(); _imageView.image = clipImage; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end
图片裁切
// UIImage+Image.h // 02-图片裁剪 #import <UIKit/UIKit.h> @interface UIImage (Image) + (UIImage *)imageWithClipImage:(UIImage *)image borderWidth:(CGFloat)borderWidth borderColor:(UIColor *)color; @end
// UIImage+Image.m // 02-图片裁剪 #import "UIImage+Image.h" @implementation UIImage (Image) + (UIImage *)imageWithClipImage:(UIImage *)image borderWidth:(CGFloat)borderWidth borderColor:(UIColor *)color { // 图片的宽度和高度 CGFloat imageWH = image.size.width; // 设置圆环的宽度 CGFloat border = borderWidth; // 圆形的宽度和高度 CGFloat ovalWH = imageWH + 2 * border; // 1.开启上下文 UIGraphicsBeginImageContextWithOptions(CGSizeMake(ovalWH, ovalWH), NO, 0); // 2.画大圆 UIBezierPath *path = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(0, 0, ovalWH, ovalWH)]; [color set]; [path fill]; // 3.设置裁剪区域 UIBezierPath *clipPath = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(border, border, imageWH, imageWH)]; [clipPath addClip]; // 4.绘制图片 [image drawAtPoint:CGPointMake(border, border)]; // 5.获取图片 UIImage *clipImage = UIGraphicsGetImageFromCurrentImageContext(); // 6.关闭上下文 UIGraphicsEndImageContext(); return clipImage; } @end
图片截屏
// ViewController.m // 03-屏幕截屏 #import "ViewController.h" #import "UIImage+Image.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. // 生成一张新的图片 UIImage *image = [UIImage imageWithCaputureView:self.view]; // image转data // compressionQuality: 图片质量 1:最高质量 NSData *data = UIImageJPEGRepresentation(image,1); [data writeToFile:@"/Users/xiaomage/Desktop/view.png" atomically:YES]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end
// UIImage+Image.h // 02-图片裁剪 #import <UIKit/UIKit.h> @interface UIImage (Image) // 圆形裁剪 + (UIImage *)imageWithClipImage:(UIImage *)image borderWidth:(CGFloat)borderWidth borderColor:(UIColor *)color; // 控件截屏 + (UIImage *)imageWithCaputureView:(UIView *)view; @end
// UIImage+Image.m // 02-图片裁剪 #import "UIImage+Image.h" @implementation UIImage (Image) + (UIImage *)imageWithClipImage:(UIImage *)image borderWidth:(CGFloat)borderWidth borderColor:(UIColor *)color { // 图片的宽度和高度 CGFloat imageWH = image.size.width; // 设置圆环的宽度 CGFloat border = borderWidth; // 圆形的宽度和高度 CGFloat ovalWH = imageWH + 2 * border; // 1.开启上下文 UIGraphicsBeginImageContextWithOptions(CGSizeMake(ovalWH, ovalWH), NO, 0); // 2.画大圆 UIBezierPath *path = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(0, 0, ovalWH, ovalWH)]; [color set]; [path fill]; // 3.设置裁剪区域 UIBezierPath *clipPath = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(border, border, imageWH, imageWH)]; [clipPath addClip]; // 4.绘制图片 [image drawAtPoint:CGPointMake(border, border)]; // 5.获取图片 UIImage *clipImage = UIGraphicsGetImageFromCurrentImageContext(); // 6.关闭上下文 UIGraphicsEndImageContext(); return clipImage; } + (UIImage *)imageWithCaputureView:(UIView *)view { // 开启位图上下文 UIGraphicsBeginImageContextWithOptions(view.bounds.size, NO, 0); // 获取上下文 CGContextRef ctx = UIGraphicsGetCurrentContext(); // 把控件上的图层渲染到上下文,layer只能渲染 [view.layer renderInContext:ctx]; // 生成一张图片 UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); // 关闭上下文 UIGraphicsEndImageContext(); return image; } @end
04-图片截取
// ViewController.m // 04-图片截取 #import "ViewController.h" @interface ViewController () @property (nonatomic, assign) CGPoint startP; @property (weak, nonatomic) IBOutlet UIImageView *imageV; @property (nonatomic, weak) UIView *clipView; @end @implementation ViewController - (UIView *)clipView{ if (_clipView == nil) { UIView *view = [[UIView alloc] init]; _clipView = view; view.backgroundColor = [UIColor blackColor]; view.alpha = 0.5; [self.view addSubview:view]; } return _clipView; } - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. // 给控制器的view添加一个pan手势 UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(pan:)]; [self.view addGestureRecognizer:pan]; } - (void)pan:(UIPanGestureRecognizer *)pan { CGPoint endA = CGPointZero; if (pan.state == UIGestureRecognizerStateBegan) { // 一开始拖动的时候 // 获取一开始触摸点 _startP = [pan locationInView:self.view]; }else if(pan.state == UIGestureRecognizerStateChanged){ // 一直拖动 // 获取结束点 endA = [pan locationInView:self.view]; CGFloat w = endA.x - _startP.x; CGFloat h = endA.y - _startP.y; // 获取截取范围 CGRect clipRect = CGRectMake(_startP.x, _startP.y, w, h); // 生成截屏的view self.clipView.frame = clipRect; }else if (pan.state == UIGestureRecognizerStateEnded){ // 图片裁剪,生成一张新的图片 // 开启上下文 // 如果不透明,默认超出裁剪区域会变成黑色,通常都是透明 UIGraphicsBeginImageContextWithOptions(_imageV.bounds.size, NO, 0); // 设置裁剪区域 UIBezierPath *path = [UIBezierPath bezierPathWithRect:_clipView.frame]; [path addClip]; // 获取上下文 CGContextRef ctx = UIGraphicsGetCurrentContext(); // 把控件上的内容渲染到上下文 [_imageV.layer renderInContext:ctx]; // 生成一张新的图片 _imageV.image = UIGraphicsGetImageFromCurrentImageContext(); // 关闭上下文 UIGraphicsEndImageContext(); // 先移除 [_clipView removeFromSuperview]; // 截取的view设置为nil _clipView = nil; } // 获取手指的偏移量 // pan translationInView:<#(UIView *)#> } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end
05-图片擦除
// // ViewController.m // 05-图片擦除 #import "ViewController.h" @interface ViewController () @property (weak, nonatomic) IBOutlet UIImageView *imageView; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(pan:)]; [self.view addGestureRecognizer:pan]; } - (void)pan:(UIPanGestureRecognizer *)pan { // 获取当前点 CGPoint curP = [pan locationInView:self.view]; // 获取擦除的矩形范围 CGFloat wh = 100; CGFloat x = curP.x - wh * 0.5; CGFloat y = curP.y - wh * 0.5; CGRect rect = CGRectMake(x, y, wh, wh); // 开启上下文 UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, NO, 0); CGContextRef ctx = UIGraphicsGetCurrentContext(); // 控件的layer渲染上去 [_imageView.layer renderInContext:ctx]; // 擦除图片 CGContextClearRect(ctx, rect); // 生成一张图片 UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); _imageView.image = image; // 关闭上下文 UIGraphicsEndImageContext(); } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; // Dispose of any resources that can be recreated. } @end
本人无商业用途,仅仅是学习做个笔记,特别鸣谢小马哥,学习了IOS,另日语学习内容有需要文本和音频请关注公众号:riyuxuexishuji