iOS高级-QuartzCore框架-复习和补充、模仿imageView、打水印
2015-08-22 15:08
567 查看
一、复习和补充
*画矩形的4种方法
1. 4个点
2. 直线,然后设置线宽
3.CGContextAddRect直接画
4.通过UIKit的OC方法,UIRectFill(内部已经拿到上下文,无需自己获取)
*另一种画路径的方法(可以把不同东西放到不同路径)
二、模仿UIImageView
1.imageView用法
2.模仿imageView
1>新建一个类MJImageView
2>添加image属性 //自定义的属性一定要重写set方法,并在set方法中重绘
3>实现drawRect:方法
4>重写setter方法
5>创建
三、打水印
1.理论
UIImage+UIImage ---> UIImage
上下文不应该画到View上了(图层类型),而是画到Image上(位图类型)。
2.操作
3.将上述代码抽成一个分类,以后打水印只需要换图片名即可。
1>新建一个类,继承自UIImage
2>提供一个方法专门用来打水印
3>导入头文件,调用这个类方法获得新图片
*画矩形的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];
相关文章推荐
- IOS开发之对象生命周期
- iOS项目开发实战——使用三种方式实现页面跳转与参数传递(三)
- [置顶] iOS单例设计模式详细讲解(单例设计模式不断完善的过程)
- iOS开发之CocoaAsyncSocket学习
- iOS项目开发实战——使用三种方式实现页面跳转与参数传递(二)
- iOS第三方开源库的吐槽和备忘
- iOS中设置导航栏标题的字体颜色和大小
- iOS项目开发实战——使用三种方式实现页面跳转与参数传递(一)
- IOS蓝牙小票打印
- iOS block 基本用法及代替代理
- iOS 项目的目录结构能看出你的开发经验
- iOS程序框架设计之皮肤切换功能
- iOS Code Signing到底什么鬼
- iOS中多线程知识总结:进程、线程、GCD、串行队列、并行队列、全局队列、主线程队列、同步任务、异步任务等
- iOS中多线程知识总结:进程、线程、GCD、串行队列、并行队列、全局队列、主线程队列、同步任务、异步任务等
- 判断客户端是iPad、安卓还是ios
- iOS单例模式
- iOS 修改项目名称
- iOS多线程编程技术NSThread; NSOperation、GCD三者使用详解
- 【iOS程序启动与运转】- RunLoop个人小结