• 源码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
  • 相关阅读:
    (转)深入理解C语言指针的奥秘
    (转)C语言在哪里?
    [转]12个摄影基本法则
    光圈使用
    ArcIMS 连接器.NET Link 使用方法
    在asp.net中使用xml文件的两种类型及用法
    利用XSL双向转换XML文档
    光圈 暴光 快门对比
    保护眼睛的电脑颜色设置
    vb.net2005动态添加网页控件的事件
  • 原文地址:https://www.cnblogs.com/laugh/p/6677594.html
Copyright © 2020-2023  润新知