• iOS UI进阶-1.1 Quartz2D 图片水印/裁剪/截图


    图片水印

    UIImage+MJ.h

    #import <UIKit/UIKit.h>
    
    @interface UIImage (MJ)
    /**
     *  打水印
     *
     *  @param bg   背景图片
     *  @param logo 右下角的水印图片
     */
    + (instancetype)waterImageWithBg:(NSString *)bg logo:(NSString *)logo;
    @end

    UIImage+MJ.m

    #import "UIImage+MJ.h"
    
    @implementation UIImage (MJ)
    + (instancetype)waterImageWithBg:(NSString *)bg logo:(NSString *)logo
    {
        UIImage *bgImage = [UIImage imageNamed:bg];
        
        // 1.创建一个基于位图的上下文(开启一个基于位图的上下文)
        UIGraphicsBeginImageContextWithOptions(bgImage.size, NO, 0.0);
        
        // 2.画背景
        [bgImage drawInRect:CGRectMake(0, 0, bgImage.size.width, bgImage.size.height)];
        
        // 3.画右下角的水印
        UIImage *waterImage = [UIImage imageNamed:logo];
        CGFloat scale = 0.2;
        CGFloat margin = 5;
        CGFloat waterW = waterImage.size.width * scale;
        CGFloat waterH = waterImage.size.height * scale;
        CGFloat waterX = bgImage.size.width - waterW - margin;
        CGFloat waterY = bgImage.size.height - waterH - margin;
        [waterImage drawInRect:CGRectMake(waterX, waterY, waterW, waterH)];
        
        // 4.从上下文中取得制作完毕的UIImage对象
        UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
        
        // 5.结束上下文
        UIGraphicsEndImageContext();
        
        return newImage;
    }
    @end

    使用方式

    - (void)viewDidLoad
    {
        [super viewDidLoad];
        
        // 1.返回水印图片
        UIImage *newImage = [UIImage waterImageWithBg:@"scene" logo:@"logo"];
        
        // 2.显示图片
        self.iconView.image = newImage;
        
        // 3.将image对象压缩为PNG格式的二进制数据
        NSData *data = UIImagePNGRepresentation(newImage);
        
        // 4.写入文件
        NSString *path = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"new.png"];
        [data writeToFile:path atomically:YES];
    }

    图片裁剪

    UIImage+MJ.h

    #import <UIKit/UIKit.h>
    
    @interface UIImage (MJ)
    + (instancetype)circleImageWithName:(NSString *)name borderWidth:(CGFloat)borderWidth borderColor:(UIColor *)borderColor;
    @end

    UIImage+MJ.m

    #import "UIImage+MJ.h"
    
    @implementation UIImage (MJ)
    
    + (instancetype)circleImageWithName:(NSString *)name borderWidth:(CGFloat)borderWidth borderColor:(UIColor *)borderColor
    {
        // 1.加载原图
        UIImage *oldImage = [UIImage imageNamed:name];
        
        // 2.开启上下文
        CGFloat imageW = oldImage.size.width + 2 * borderWidth;
        CGFloat imageH = oldImage.size.height + 2 * borderWidth;
        CGSize imageSize = CGSizeMake(imageW, imageH);
        UIGraphicsBeginImageContextWithOptions(imageSize, NO, 0.0);
        
        // 3.取得当前的上下文
        CGContextRef ctx = UIGraphicsGetCurrentContext();
        
        // 4.画边框(大圆)
        [borderColor set];
        CGFloat bigRadius = imageW * 0.5; // 大圆半径
        CGFloat centerX = bigRadius; // 圆心
        CGFloat centerY = bigRadius;
        CGContextAddArc(ctx, centerX, centerY, bigRadius, 0, M_PI * 2, 0);
        CGContextFillPath(ctx); // 画圆
        
        // 5.小圆
        CGFloat smallRadius = bigRadius - borderWidth;
        CGContextAddArc(ctx, centerX, centerY, smallRadius, 0, M_PI * 2, 0);
        // 裁剪(后面画的东西才会受裁剪的影响)
        CGContextClip(ctx);
        
        // 6.画图
        [oldImage drawInRect:CGRectMake(borderWidth, borderWidth, oldImage.size.width, oldImage.size.height)];
        
        // 7.取图
        UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
        
        // 8.结束上下文
        UIGraphicsEndImageContext();
        
        return newImage;
    }
    @end

    使用方法:

    - (void)viewDidLoad
    {
        [super viewDidLoad];
        
        UIImage *newImage = [UIImage circleImageWithName:@"me" borderWidth:3 borderColor:[UIColor whiteColor]];
        self.iconView.image = newImage;
        
        NSData *data = UIImagePNGRepresentation(newImage);
        NSString *path = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"new.png"];
        [data writeToFile:path atomically:YES];
    }

    效果

    图片截图

    UIImage+MJ.h

    #import <UIKit/UIKit.h>
    
    @interface UIImage (MJ)
    + (instancetype)captureWithView:(UIView *)view;
    @end

    UIImage+MJ.m

    #import "UIImage+MJ.h"
    
    @implementation UIImage (MJ)
    + (instancetype)captureWithView:(UIView *)view
    {
        // 1.开启上下文
        UIGraphicsBeginImageContextWithOptions(view.frame.size, NO, 0.0);
        
        // 2.将控制器view的layer渲染到上下文
        [view.layer renderInContext:UIGraphicsGetCurrentContext()];
        
        // 3.取出图片
        UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
        
        // 4.结束上下文
        UIGraphicsEndImageContext();
        
        return newImage;
    }
    @end

    使用方法

    - (IBAction)clip {
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
            // 1.捕捉
            UIImage *newImage = [UIImage captureWithView:self.view];
            
            // 2.写文件
            NSData *data = UIImagePNGRepresentation(newImage);
            NSString *path = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:@"new.png"];
            [data writeToFile:path atomically:YES];
        });
    }
  • 相关阅读:
    python 处理protobuf协议
    python 删除git Jenkinsfile文件
    如何用python操作XML文件
    Linux笔记
    JAVA bean为何要实现序列化
    mysql中给查询结果添加序号列
    生产问题之泛型自动推断(JDK1.7新特性)
    生产问题之StackOverflowError异常小记
    Linux下DB2指令总结
    简单理解TCP/IP协议
  • 原文地址:https://www.cnblogs.com/jys509/p/4843739.html
Copyright © 2020-2023  润新知