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];

 

posted on 2015-08-22 15:08  Marshall_Yin  阅读(200)  评论(0编辑  收藏  举报