【问题标题】:why CGContextSaveGState is not required even after several modification to the current context?为什么即使在对当前上下文进行多次修改后也不需要 CGContextSaveGState?
【发布时间】:2012-03-17 23:49:01
【问题描述】:

我真的在 Quartz2D 上苦苦挣扎了 10 多天,请帮助我理解一些概念,我将非常感激,请查看此代码和屏幕截图 url。

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

//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。怎么可能 该上下文已被修改,并且不会影响先前的绘图 在这种情况下,像蓝色边框这样的项目和坐标转换 文本。

如果我在任何方面缺乏让您理解我的观点的地方,请纠正我。

提前致谢, 问候。

【问题讨论】:

    标签: ios core-graphics


    【解决方案1】:

    Quartz 2D 使用“画家的模型”。这意味着,你画了一件东西,它就完成了。然后你画另一个东西,它在你之前画的之上。然后你画另一个东西,然后在上面,等等。如果我拿起一个邮票,把它浸在油漆里,然后把它压在纸上,然后把它翻过来,在纸的另一部分再做一次,第一个压印的图像不会不要因为我翻了邮票就翻了。

    每次看到“描边”或“绘图”时,您都在修改最终图像。以后对上下文的更改不会影响这一点。

    【讨论】:

    • 感谢您的回复,但如果是这种情况,那么为什么我们需要 CGContextSaveGState 和 CGContextRestoreGState?会发生什么我想绘制一个旋转的图像,而另一个通常意味着不旋转。
    • 您需要 CGContextSaveCGState 来处理您想要回到旧状态的情况。这在为您做一些绘图的函数中最常见(否则可能会使您的上下文处于奇怪的状态)。在循环中也很常见。 CGContextSaveCGState 在您提到要旋转的位置时也很有用,然后您恢复上下文并在不旋转的情况下绘制第二个。
    • 非常感谢您的帮助,它真的很有帮助,但我仍然对画家模型和保存图形状态有点困惑:) 需要做更多的练习。如果您可以向我推荐任何quartz2D 教程,那就太棒了,我在网上找不到任何有用的教程。再次感谢您的出色帮助。
    • 这个特定问题(以及其他几个问题)的最佳位置是 Quartz 2D 编程指南:developer.apple.com/library/ios/#documentation/graphicsimaging/…
    • iOS:PTL (iosptl.com) 的第 6 章详细介绍了这一点。它面向在 iOS 方面具有一定背景的开发人员,但如果您有这些背景,那么第 6 章包括对上下文和 CGContextSaveGState 与 UIGraphicsPushcontext 的广泛讨论,以及许多提高核心图形性能和外观的方法。
    猜你喜欢
    • 1970-01-01
    • 2012-07-14
    • 2023-03-18
    • 2015-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-28
    相关资源
    最近更新 更多