【发布时间】:2010-11-25 11:31:45
【问题描述】:
如果我对变暗图像的确切色调等不是很挑剔,有没有一种快速而肮脏的方法来绘制稍微变暗的 NSImage,像这样?我在网上搜索过,并没有真正找到我想要的东西(但在理解图形和正确的技术术语方面我不是很好)。
我实际上正在为与上述 Xcode 调暗图标相同的用例调暗图标(即文档有未保存的更改)。
【问题讨论】:
标签: objective-c cocoa macos nsimage
如果我对变暗图像的确切色调等不是很挑剔,有没有一种快速而肮脏的方法来绘制稍微变暗的 NSImage,像这样?我在网上搜索过,并没有真正找到我想要的东西(但在理解图形和正确的技术术语方面我不是很好)。
我实际上正在为与上述 Xcode 调暗图标相同的用例调暗图标(即文档有未保存的更改)。
【问题讨论】:
标签: objective-c cocoa macos nsimage
这对我来说很好用:
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(...) 消除临时黑色图像]
【讨论】:
NSRectFillUsingOperation在iconImage之上绘制可以去掉blackImage。
NSRectFillUsingOperation(),谢谢尼古拉!完整地学习 Cocoa 肯定是一个终生的项目。 :)
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
}
【讨论】: