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];
  • 相关阅读:
    C# 数据库访问
    ArcGIS API For Silverlight使用在线地图的多种方法总结
    Google Map Api 谷歌地图接口整理
    定义函数up(ch),如字符变量ch是小写字母就转换成大写字母并通过up返回,否则字符ch不改变。要求在短小而完全的程序中显示这个程序是怎样被调用的-简单
    编写一个求方程ax^2+bx+c=0的根的程序,用3个函数分别求当b^2-4ac大于零、等于零和小于零时的方程的根。要求从主函数输入a、b、c的值并输出结果-简单
    已知一个string的对象str的内容为“we are here!”, 使用多种方法输出字符“h”-简单
    使用多种方法编写将两个字符串连接在一起的程序-简单
    c++简单函数应用
    编写一个完整的程序,它读入15个float值,用指针把它们存放在一个存储快里,然后输出这些值的和以及最小值
    编写一个为int型变量分配100个整型量空间的程序-简单
  • 原文地址:https://www.cnblogs.com/marshall-yin/p/4750299.html
Copyright © 2011-2022 走看看