为什么即使在对当前上下文进行多次修改后也不需要CGContextSaveGState?

时间:2012-02-28 13:48:25

标签: ios core-graphics

我真的在使用Quartz2D超过10天了,请帮助我理解一些概念,我将非常感激,请查看此代码和截图网址。

此代码使用边框绘制图像并向其写入文本,图像将成为带边框和文本的全新图像。

//part 1 
CGSize cgs = CGSizeMake(250.0, 400.0);
UIGraphicsBeginImageContext(cgs);

CGRect rectangle = CGRectMake(0,0,cgs.width,cgs.height);
CGRect imageRect = CGRectInset(rectangle, 5.4, 5.4);
imageRect.size.height -= 100;

UIImage *myImage = [UIImage imageNamed:@"BMW.jpg"]; 
[myImage drawInRect:imageRect];    

CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetLineWidth(context, 10.0);
    CGContextSetRGBStrokeColor(context, 0.0, 0.0, 1.0, 1.0);
CGContextStrokeRect(context, rectangle);
//



//part 2

 1. CGRect contextRect = rectangle;
 2. CGContextTranslateCTM(context, 0, contextRect.size.height);
 3. CGContextScaleCTM(context, 1, -1);
 4. float w, h;
 5. w = contextRect.size.width;
 6. h = contextRect.size.height;
 7. CGContextSelectFont (context, "Helvetica-Bold", 25,
    kCGEncodingMacRoman);
 8. CGContextSetCharacterSpacing (context, 5);
 9. CGContextSetRGBFillColor(context, 0.0, 1.0, 1.0, 1.0);
 10. CGContextSetRGBStrokeColor(context, 1.0, 0.0, 0.0, 1.0);
 11. CGContextShowTextAtPoint(context, 45, 50, "Quartz 2D", 9);

//



//part 3
UIImage *testImg =  UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

[testImg drawAtPoint:CGPointMake(35, 10)];
// 

http://i40.tinypic.com/140aptv.png

代码的第1部分和第3部分对我来说非常清楚

问题与第2部分有关

  第2行和第3行的

坐标被转换,因此不显示文本   颠倒了,但是uiimage已经在内部处理这个问题,为什么呢   没有转变为颠倒?为什么它仍然在显示   转换后的正确位置使用相同的文本   背景?我问这个是因为当uiimage坐标已经存在时   修改然后这个坐标变换不会再次使用uiimage   倒过来了?

     在第9行和第10行上调用fillcolor和strokecolor方法   fillcolor改变文本颜色,但strokecolor没有做任何事情   发短信的原因?为什么没有CGContextSaveGState它修改了   文字颜色不是边框颜色?

     

关于我上面提到的这两点,常见的困惑是   为什么它完美地工作为什么这个代码不需要   CGContextSaveGState和CGContextRestoreGState。怎么可能   该上下文被修改,并没有影响以前的绘图   在这种情况下像蓝色边框的项目和坐标转换   文本。

如果我没有任何方式让你明白我的观点,请纠正我。

提前致谢, 问候。

1 个答案:

答案 0 :(得分:0)

Quartz 2D使用“画家的模型”。这意味着,你画了一件事,就完成了。然后你绘制另一个东西,它继续你之前绘制的东西。然后你绘制另一个东西,然后在顶部,等等。如果我拿起一个邮票,将它浸在油漆中并将其按到纸上,然后把它翻过来再做一遍纸的另一部分,第一个标记的图像没有因为我翻了一下邮票而翻转过来。

每次看到“笔画”或“画画”时,都会修改最终图像。后来对上下文的更改不会影响到这一点。