Objective c 绘制暗显NSImage(如禁用视图)的最简单方法

Objective c 绘制暗显NSImage(如禁用视图)的最简单方法,objective-c,cocoa,macos,nsimage,Objective C,Cocoa,Macos,Nsimage,如果我对暗显图像的确切色调等不太在意,有没有一种快速而肮脏的方法来绘制稍微暗显的NSImage,像这样?我在网上搜索过,但找不到我想要的东西(但在理解图形和正确的技术术语方面我不是很好) 实际上,我正在为与上述Xcode暗显图标相同的用例暗显图标(即文档有未保存的更改)。这对我来说很好: NSImage *iconImage = [NSImage imageNamed:@"Icon"]; NSSize iconSize = [iconImage size]; NSRect iconRect

如果我对暗显图像的确切色调等不太在意,有没有一种快速而肮脏的方法来绘制稍微暗显的NSImage,像这样?我在网上搜索过,但找不到我想要的东西(但在理解图形和正确的技术术语方面我不是很好)


实际上,我正在为与上述Xcode暗显图标相同的用例暗显图标(即文档有未保存的更改)。

这对我来说很好:

NSImage *iconImage = [NSImage imageNamed:@"Icon"];
NSSize iconSize = [iconImage size];
NSRect iconRect = NSMakeRect(0.0, 0.0, iconSize.width, iconSize.height);
[iconImage lockFocus];
[[NSColor colorWithCalibratedWhite:0.0 alpha:0.33] set];
NSRectFillUsingOperation(iconRect, NSCompositeSourceAtop);
[iconImage unlockFocus];
[iconImage drawInRect:iconRect
              fromRect:iconRect
             operation:NSCompositeSourceOver
              fraction:0.75];
基本上,我在实际图标的顶部添加了一个不透明度为33%的黑色层(用
nscompositesourcetop
将其遮盖)。然后我只是画了一个不透明度为75%的暗显图标


[编辑:按照Nikolai Ruhe的建议,使用NSRectFillUsingOperation(…)删除临时黑色图像。

Swift 5函数创建任何输入图像的暗显版本:

func dimmedImage(_ image: NSImage, alpha: CGFloat) -> NSImage {
    let newImage = NSImage(size: image.size)
    newImage.lockFocus()

    let imageRect = NSRect(origin: .zero, size: image.size)
    image.draw(in: imageRect, from: imageRect, operation: .sourceOver, fraction: alpha)

    newImage.unlockFocus()
    return newImage
}

不管是谁否决了你,都有点苛刻。这确实有效。不管是谁被否决了,请做一件体面的事,并评论一下原因,好吗?:)使用
NSRectFillUsingOperation
iconImage
上绘制,您可以摆脱
blackImage
。我自己也这么想。只需在绘制图像的矩形顶部绘制一个半透明的黑色矩形。基本上应该做同样的事情。就要重构了,尼古拉,你能举个例子吗?我认为我做得不对,因为我只是得到一个大的黑色正方形来遮住图像(它有透明区域)。也许我误解了。@d11wtq,@Nikolai:修正了。直到现在才知道NSRectFillUsingOperation(),谢谢Nikolai!全面学习可可当然是一个终生的项目。:)