首页 > 代码库 > 源码0301-图片水印-裁剪-截屏-截取-擦除

源码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 = http://www.mamicode.com/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

 

源码0301-图片水印-裁剪-截屏-截取-擦除