【问题标题】:CGContextClip() using an inverted pathCGContextClip() 使用反向路径
【发布时间】:2012-05-25 04:08:21
【问题描述】:

我想在我的CGContext 上剪裁绘图,但我需要它正好相反,即我想使用CGContextAddRect() 在我的剪裁路径中添加几个矩形,并且剪裁应该以所有的方式完成我添加到剪切路径中的矩形不受任何绘图操作的影响。通常情况下,它只是相反的方式,即绘图函数绘制到已添加到剪切路径的矩形,而未添加到剪切路径的区域不受影响。所以我想我需要的只是一种在调用CGContextClip()之前反转剪切路径的方法。回到 QuickDraw 时代,这可以通过使用区域轻松完成,然后为每个矩形调用 XorRgn()。但是使用 Quartz 似乎更复杂。有没有人有一个简单的解决方案来实现这一点,或者我是否需要自己进行所有这些路径反转计算?

【问题讨论】:

    标签: macos cocoa quartz-graphics macos-carbon


    【解决方案1】:

    您可以将整个边界添加为一个矩形,然后添加要从绘图中排除的矩形并使用CGContextEOClip

    例子:

    - (void)drawRect:(NSRect)dirtyRect
        CGContextRef ctx = [[NSGraphicsContext currentContext] graphicsPort];
        //Fill the background with gray:
        CGContextSetRGBFillColor(ctx, 0.5, 0.5, 0.5, 1);
        CGContextFillRect(ctx, NSRectToCGRect(self.bounds));
        CGContextAddRect(ctx, NSRectToCGRect(self.bounds));
        //Add some rectangles:
        CGContextAddRect(ctx, CGRectMake(10, 10, 100, 100));
        CGContextAddRect(ctx, CGRectMake(120, 120, 50, 100));
        //Clip:
        CGContextEOClip(ctx);
        //Fill the entire bounds with red:
        CGContextSetRGBFillColor(ctx, 1.0, 0.0, 0.0, 1.0);
        CGContextFillRect(ctx, NSRectToCGRect(self.bounds));
    }
    

    如果你在最后画一个图像而不是填充一个红色矩形,效果会变得更加明显。

    【讨论】:

    • 好主意,但是当剪切矩形重叠时这不起作用。
    • 好的,我想我现在明白了。对于要添加的每个剪切矩形,我必须调用一次 CGContextEOClip()。然后它甚至适用于重叠的矩形!非常感谢您的提示!
    • 非常感谢@omz 和@Andreas!我多年来一直在寻找这个答案,但从未弄清楚如何解决重叠矩形问题。完美:)
    • 如果你的反向路径是由多个子路径组成的呢? EOClip 会在它们重叠时创建...
    【解决方案2】:

    一种方法是将剪切路径绘制到位图上下文,反转生成的位图,并通过调用 CGContextClipToMask() 将其用作原始图像上的掩码。

    【讨论】:

    • 谢谢,这看起来确实是一种可行的方法。不过,我想知道是否有可能不必通过位图掩码路线。
    猜你喜欢
    • 1970-01-01
    • 2020-10-04
    • 2016-03-18
    • 2019-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-30
    相关资源
    最近更新 更多