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

时间:2010-11-25 11:31:45

标签: objective-c cocoa macos nsimage

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

Non-dimmed Dimmed

我实际上是在调整与上面的Xcode调光图标相同的用例图标(即文档有未保存的更改)。

2 个答案:

答案 0 :(得分:16)

这对我来说很好用:

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%不透明度的黑色图层(用NSCompositeSourceAtop屏蔽它)。然后我只是绘制了不透明度为75%的暗淡图标。

[编辑:根据 Nikolai Ruhe ]

的建议,使用NSRectFillUsingOperation(...)删除临时黑图像

答案 1 :(得分:0)

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
}