【问题标题】:How to get pixel perfect drawing with cocoa如何用可可获得像素完美的绘图
【发布时间】:2026-02-01 21:10:01
【问题描述】:

我正在尝试在 Cocoa 中绘制我的一些 UI 元素,主要是按钮的图标,但我很难获得我想要的那种精确度。

我正在使用这样的超级简单代码来绘制矩形:

[[NSColor redColor] set];
[NSBezierPath strokeRect:myRect];

但我看到的是红色矩形线总是褪色。

我在这里错过了什么?

【问题讨论】:

  • NSBezierPath 存在极端性能问题,您确定要将其用于矩形吗?
  • 我假设原始发布者打算进行更复杂的绘图,但首先尝试绘制一个矩形。
  • 是的,这是我能做的最简单的例子,但我不知道 NSBezierPath 对性能的影响,所以我会看看替代方案。
  • BenL0:根据我的经验,NSBezierPath 还不错。如果要绘制数千条路径,可能会遇到问题。但是完全避免 NSBezierPath 听起来像是过早的优化。仅当您在测试应用时发现实际性能问题时,我才会寻找替代方案。

标签: cocoa drawing nsbezierpath


【解决方案1】:

Cocoa 坐标实际上指定了您要绘制的像素的中心。这意味着,例如,如果你想在左下角的像素上绘制,你应该使用坐标 (0.5,0.5)。

在您的坐标中添加/减去半个像素,它们应该是完美的像素。

【讨论】:

    【解决方案2】:

    您可以像这样为图形上下文禁用抗锯齿:

    [[NSGraphicsContext currentContext] setShouldAntialias:NO];
    

    或者您可以使用 NSFrameRect 代替贝塞尔路径,这样可以获得您想要的精度,同时保持抗锯齿:

    NSFrameRect(myRect);
    

    【讨论】:

    • 好吧,也许是因为禁用抗锯齿不是一个好主意
    • 这不是正确的答案——这是解决发帖者问题的方法。请参阅 Jakob 的回答。
    • 虽然这修复了褪色问题,但它确实破坏了 OS X 的定义功能之一 - 令人难以置信的抗锯齿。如果它只有一个像素宽或高,抗锯齿使它更容易看到。如果它是一个大的形状或其他东西,抗锯齿并不重要(除非你正在为图形设计设计东西。我不确定这是否值得被投票赞成或反对 - 这完全是一个见仁见智的问题。也就是说,混叠破坏了文字和小形状的外观。