【问题标题】:How to erase drawn objects in Cocoa?如何擦除 Cocoa 中绘制的对象?
【发布时间】:2013-02-15 00:33:14
【问题描述】:

我创建了一个绘图程序。效果很好,您可以导入图像并使用不同的颜色和画笔配置对其进行注释。

我的问题是我不知道如何允许擦除。我为 android 编写了同样的应用程序并使用 PorterDuffXferMode 对象进行擦除。我在 Cocoa 中找不到类似的东西。

我是否遗漏了一些明显的东西?我是可可豆。

我正在使用 NSBezierPath 和 NSRectFill 的组合来绘制 NSView。

更新:

在阅读此处的回复之前,我修改了我的代码以在原始 NSView 下方使用嵌套的 NSView。所以我的想法是在底部 Z 顺序视图上绘制背景图像,并在顶部 NSView 上完成所有图形。它画得很好,但是在我的顶视图中,我在要擦除的区域上调用 NSClearRect 并且它是白色的,而不是擦除到底层。

为什么不显示到底层?

我将研究使用 CALayers,但您必须给我一些时间来消化您所写的内容。就像我之前说的,我是 Objective C 和 Cocoa 的菜鸟。

【问题讨论】:

  • 有助于了解您的绘画方式。 OpenGL?核心图形?你在画什么?
  • 您将必须绘制 2 张图像 - 后面的原始图像加上带有注释的另一张图像。即,如果您在原始图像上绘制,您已经破坏了原始图像中的信息。您必须在某处保存该信息的副本...
  • 您可能会发现在您的上下文中绘制到 CGLayer 会很有帮助...查看CGContextBeginTransparencyLayer()...
  • 或者在您的视图中使用 2 个 CoreAnimation 层——一个带有您的图像(背景),另一个在您的注释图像顶部。
  • >如果您使用基于图层的视图,情况可能大致相同--cf。 developer.apple.com/library/mac/#documentation/Cocoa/Reference/…

标签: macos cocoa drawing nsview quartz-graphics


【解决方案1】:

我不确定绘图环境(传输模式)如何在 Android 上准确运行,但 Core Graphics 提供了所有标准和 Photoshop 风格的混合模式等。

您对预期的“擦除”行为实际上是什么并不是很具体。要清除上下文中的矩形,请使用CGContextClearRect()。如果要清除其他形状,请设置剪贴蒙版,如this question 所示。

如果您想做一些比清除区域更复杂的事情(例如,想要重新绘制背景颜色或图像或图案),那么您可以查看图像蒙版和混合模式。

【讨论】:

    猜你喜欢
    • 2012-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-06
    • 2013-03-29
    • 2011-11-24
    相关资源
    最近更新 更多