Quartz 2D和Core Graphics的区别
Quartz 2D:是一个绘图引擎。因此我们一般都是用CGxxxx命名的函数进行绘图。
Core Graphics:是基于Quartz 2D绘图引擎的一个C语言的API绘图框架。它也是iOS开发中最基本的框架(Framework)之一。两点原因,第一是该框架是每一个iOS应用最初被建立时,就被系统默认添加的三个框架(Foundation、UIKit、Core Graphics)之一;另一点是,我们平时常见的各种UIKit框架提供的UI控件,实际上都是由Core Graphics进行绘制的。
一直傻傻认为Quartz 2D就是画贝塞尔曲线 画贝塞尔曲线就是Quartz 2D 其实不是这样子的
Quartz 2D 和 贝塞尔曲线的区别
贝塞尔曲线的方法是基于Quartz 2D的框架中封装出来的 只是一部分
用法 : [UIBezierPath bezierPathWithArcCenter:CGPointMake(self.frame.size.width / 2, self.frame.size.height/2) radius:rr startAngle: 0 - M_PI / 8 endAngle:l1 / l * 2 * M_PI - M_PI / 8 clockwise:YES];
我们在哪里绘图?
在图形上下文对象中绘图,在Quartz 2D中的绘图上下文可以是位图Bitmap、PDF、窗口Window、层Layer、打印对象Printer。最常见的,我们在UIView和UIView子类上绘图,其实是在系统为我们已经准备好的一个图形上下文CGContextRef对象上绘图。这个CGContextRef对象只能在drawRect函数中获取,而且一定是自动调用的drawRect函数。(假如你自己手动调用该函数,将无法获取图形上下文CGContextRef对象,从而也就无法成功绘图。当然,这样做并不会造成app崩溃crash,或者其他致命错误,但是因为无法绘图,因此这样做是毫无意义的)。
绘图的步骤:(在drawRect函数中 继承UIView 就会有)
1.获取绘图上下文
2.创建并设置路径
3.将路径添加到上下文
4.设置上下文状态
5.绘制路径
6.释放路径
Quartz2D的内存管理
使用含有“Create”或“Copy”的函数创建的对象,使用完后必须释放,否则将导致内存泄露
使用不含有“Create”或“Copy”的函数获取的对象,则不需要释放
如果retain了一个对象,不再使用时,需要将其release掉
可以使用Quartz 2D的函数来指定retain和release一个对象。例如,如果创建了一个CGColorSpace对象,则使用函数CGColorSpaceRetain和CGColorSpaceRelease来retain和release对象。
也可以使用Core Foundation的CFRetain和CFRelease。注意不能传递NULL值给这些函数
下面是我敲的代码
这段是在VC里的代码
import "ViewController.h"
import "JPCoreGraphicsView.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
JPCoreGraphicsView * view = [[JPCoreGraphicsView alloc]initWithFrame:CGRectMake(0, 0, 300, 300)];
view.center = self.view.center;
view.backgroundColor = [UIColor whiteColor];
[self.view addSubview:view];
}
这段是在自定义UIView里的代码
import "JPCoreGraphicsView.h"
@implementation JPCoreGraphicsView
-(void)drawRect:(CGRect)rect {
//注意:在没有其他上下文的时候,UIGraphicsGetCurrentContext必须写到drawRect:方法里面
//获取绘图的上下文
CGContextRef context = UIGraphicsGetCurrentContext();
//设置🖌颜色
CGContextSetStrokeColorWithColor(context, [UIColor orangeColor].CGColor);
//设置🖌的线的宽度
CGContextSetLineWidth(context, 5);
[self 绘制圆弧:context];
}
pragma mark - 绘制图片
-
(void)绘制图片
{
//把图片的绘制指定的点,取图片真实大小
//[[UIImage imageNamed:@"priroda_peyzazh_zima_nebo_sneg_polnolunie_derevya_pticy_vecher_10733_640x360"] drawAtPoint:CGPointMake(20, 20)];//把图片绘制到指定区域 CGPointMake偏移多少
[[UIImage imageNamed:@"1.jpeg"] drawInRect:CGRectMake(0, 0, 300, 300)];
}
pragma mark - 绘制文字
-
(void)绘制文字
{
//绘制到指定的点 withAttributes 下面那有 @{NSForegroundColorAttributeName:[UIColor blueColor],NSFontAttributeName:[UIFont systemFontOfSize:40]}// [@"string" drawAtPoint:<#(CGPoint)#> withAttributes:<#(nullable NSDictionary<NSString *,id> *)#>]
//绘制到指定区域
[@"JP666" drawInRect:CGRectMake(20, 30, 200, 50) withAttributes:@{NSForegroundColorAttributeName:[UIColor blueColor],NSFontAttributeName:[UIFont systemFontOfSize:40]}];
}
pragma mark - 绘制扇形
-
(void)绘制扇形:(CGContextRef)context
{//设置线条颜色 不设置就没有了
// [[UIColor greenColor] setStroke];
//设置填充颜色
[[UIColor redColor] setFill];
//圆心
CGPoint center = CGPointMake(150, 150);
//创建一个path
/**
* 圆弧的中心,半径,开始角度,结束角度,是否顺时针方向
*/
UIBezierPath *path = [UIBezierPath bezierPathWithArcCenter:center radius:90 startAngle:0 endAngle:M_PI*2 clockwise:YES];
// //添加一个线段
// [path addLineToPoint:center];
//填充
[path fill];
//// 设置线条的宽度
// path.lineWidth = 5;
//// 绘制
// [path stroke];
}
pragma mark - 绘制圆弧
- (void)绘制圆弧:(CGContextRef)context
{
//1表示逆时针
/**- x,y为圆点坐标,radius半径,startAngle为开始的弧度,endAngle为 结束的弧度,clockwise 0为顺时针,1为逆时针。
*/
CGContextAddArc(context, 100, 100, 50, 0, M_PI/2, 0);
- x,y为圆点坐标,radius半径,startAngle为开始的弧度,endAngle为 结束的弧度,clockwise 0为顺时针,1为逆时针。
// //设置🖌颜色
// CGContextSetStrokeColorWithColor(context, [UIColor blueColor].CGColor);
//设置🖌的线的宽度
CGContextSetLineWidth(context, 20);
CGContextStrokePath(context);
}
用Quartz2D来加水印的代码如下
VC里的代码
import "ViewController.h"
import "UIImage+WaterMark.h"
@interface ViewController ()
@end
@implementation ViewController
-
(void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.//添加水印
UIImage *image = [[UIImage imageNamed:@"1"] waterMarkWithText:@"还有谁!?"];UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
imageView.bounds = CGRectMake(0, 0, 300, 400);
imageView.center = self.view.center;
[self.view addSubview:imageView];/*
图片压缩:
1.宽高比例压缩。 UIGraphicsBeginImageContextWithOptions
2.图片质量的压缩。 UIImageJPEGRepresentation(要压缩的图片, 压缩比[0-1])
*/
}
分类里的代码
分类如何创建呢
在类.h里的代码
/**
- 图片添加水印
*/
- (UIImage *)waterMarkWithText:(NSString *)text;
.m
/**
- 图片添加水印
*/
-
(UIImage *)waterMarkWithText:(NSString *)text
{
//开启图片上下文
UIGraphicsBeginImageContextWithOptions(self.size, YES, 0);
//先把当前图片绘制到当前上下文中
[self drawInRect:CGRectMake(0, 0, self.size.width, self.size.height)];
//在把文字绘制到上下文中
[text drawAtPoint:CGPointMake(10, 10) withAttributes:@{NSForegroundColorAttributeName:[UIColor whiteColor],NSFontAttributeName:[UIFont systemFontOfSize:50]}];
//获取上下文图片
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
//结束上下图
UIGraphicsEndImageContext();return image;
}
效果图如下