zoukankan      html  css  js  c++  java
  • iOS高级-QuartzCore框架-复习和补充、模仿imageView、打水印

    一、复习和补充
    *画矩形的4种方法
    1. 4个点
    2. 直线,然后设置线宽
    3.CGContextAddRect直接画
    4.通过UIKit的OC方法,UIRectFill(内部已经拿到上下文,无需自己获取)
    *另一种画路径的方法(可以把不同东西放到不同路径)

    //1.先创建一个路径
    //PS:方法中有Create/copy/retain的,要做一次release
    CGPathRef path = CGPathCreateMutable();
    //2.拼接路径
    CGPathMoveToPoint(path,NULL,0,0);
    CGAddLineToPoint(path,NULL,100,100);
    //3.添加路径到上下文
    CGContextAddPath(ctx,path);
    //4.渲染
    CGContextStrokePath(ctx);
    //5.释放
    CGPathRelease(path);

    二、模仿UIImageView
    1.imageView用法

    -(void)imageViewUse
    {
    UIImage *image = [UIImage imageNamed:@"me"];
    //使用initWithImage:方法,尺寸默认为图片尺寸。不需要另外设置frame
    UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
    [self.view addSubView:imageView];
    }

    2.模仿imageView
    1>新建一个类MJImageView
    2>添加image属性 //自定义的属性一定要重写set方法,并在set方法中重绘
    3>实现drawRect:方法

    -(void)drawRect:(CGRect)rect
    {
      [self.image drawInRect:rect];
    }

    4>重写setter方法

    -(void)setImage:(UIImage *)image
    {
      _image = image
      [self setNeedsDisplay];
    }

    5>创建

    MJImageView *imageView = [[MJImageView alloc] init];
    imageView.image = [UIImage imageNamed:@"me"];
    imageView.frame = CGRectMake(100,100,100,100);
    [self.view addSubview:imageView];

    三、打水印
    1.理论
    UIImage+UIImage ---> UIImage
    上下文不应该画到View上了(图层类型),而是画到Image上(位图类型)。
    2.操作

    UIImage *bgImage = [UIImage imageNamed:@"scene"];
    //上下文:基于位图(bitmap),所有的东西需要绘制到一张新的图片上去
    //1.创建一个基于位图的上下文(开启一个基于位图的上下文)
    //size:新图片的尺寸
    //opaque: YES:不透明 NO:透明
    //UIGraphicsBeginImageContextWithOptions(CGSize size,BOOL opaque ,CGFloat scale)
    
    //这行代码过后,就相当于创建一张新的bitmap,也就是新的UIImage对象
    UIGraphicsBeginImageContextWithOptions(bgImage.size,NO,0.0);
    
    //2.画背景
    [bgImage drawInRect:CGRectMake(0,0,bgImage.size.width,bgImage.size.height)]; 
    
    
    //3.画右下角的水印
    UIImage *markImage = [UIImage imageNamed:@"logo"];
    CGFloat scale = 0.2;
    CGFloat margin = 5;
    CGFloat markW = markImage.size.width * scale;
    CGFloat markH = markImage.size.height * scale;
    CGFloat markX = bgImage.size.width - markW - margin;
    CGFloat markY = bgImage.size.height - markH - margin;
    [markImage drawInRect:CGRectMake(markX,markY,markW,markH)]; 
    
    
    //4.从上下文中取得制作完毕的UIImage对象
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
    
    //5.结束上下文
    UIGraphicsEndImageContext();
    
    //6.显示到UIImageView
    PS:先监听新拖的ImageView
    self.iconView.image = newImage;
    
    //7.将image对象压缩为PNG格式的二进制数据
    NSData *data = UIImagePNGRepresentation(newImage);
    
    //8.写入文件
    NSString *path = [[NSSearchPathForDirectoriesInDomains (NSDocumentDirectory,NSUserDomainMask,YES) lastObject] 
    stringByAppendingPathComponent:@"new.png"];
    
    [data writeToFile:path atomically:YES];

    3.将上述代码抽成一个分类,以后打水印只需要换图片名即可。
    1>新建一个类,继承自UIImage
    2>提供一个方法专门用来打水印

    +(instancetype)markImageWithBg:(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 *markImage = [UIImage imageNamed:logo];
    CGFloat scale = 0.2;
    CGFloat margin = 5;
    CGFloat markW = markImage.size.width * scale;
    CGFloat markH = markImage.size.height * scale;
    CGFloat markX = bgImage.size.width - markW - margin;
    CGFloat markY = bgImage.size.height - markH - margin;
    [markImage drawInRect:CGRectMake(markX,markY,markW,markH)]; 
    
    
    //4.从上下文中取得制作完毕的UIImage对象
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
    
    //5.结束上下文
    UIGraphicsEndImageContext();
    
    return newImage;
    }

    3>导入头文件,调用这个类方法获得新图片

    //1.返回带水印的图片
    UIImage *newImage =[UIImage markImageWithBg:@"scene" logo:@"logo"]; 
    
    //2.显示到UIImageView
    PS:先监听新拖的ImageView
    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];
  • 相关阅读:
    P5468 [NOI2019]回家路线
    P1919 【模板】A*B Problem升级版(FFT快速傅里叶)
    P4390 [BOI2007]Mokia 摩基亚
    P4234 最小差值生成树
    P5459 [BJOI2016]回转寿司
    P2173 [ZJOI2012]网络
    P2163 [SHOI2007]园丁的烦恼
    P3826 [NOI2017]蔬菜
    P3327 [SDOI2015]约数个数和
    P1829 [国家集训队]Crash的数字表格 / JZPTAB
  • 原文地址:https://www.cnblogs.com/marshall-yin/p/4750299.html
Copyright © 2011-2022 走看看