I have a grayscale image which I want to use for drawing Cocoa controls. The image has various levels of gray. Where it is darkest, I want it to draw a specified tint color dark
Swift 5 version that also handles the alpha component of the tint color.
I use this to support dark mode with multiple icon states by converting template icons to different colors and transparency levels. For example, you could pass NSColor(white: 0, alpha: 0.5)
to get a dimmed version of an icon for light mode, and NSColor(white: 1, alpha: 0.5)
to get a dimmed version for dark mode.
func tintedImage(_ image: NSImage, color: NSColor) -> NSImage {
let newImage = NSImage(size: image.size)
newImage.lockFocus()
// Draw with specified transparency
let imageRect = NSRect(origin: .zero, size: image.size)
image.draw(in: imageRect, from: imageRect, operation: .sourceOver, fraction: color.alphaComponent)
// Tint with color
color.withAlphaComponent(1).set()
imageRect.fill(using: .sourceAtop)
newImage.unlockFocus()
return newImage
}