从NSColor创建NSImage

rsh*_*rma 15 cocoa objective-c

我有一个包含颜色列表的PopUp按钮.在颜色标题的前面,我需要显示一个相同颜色的小盒子(_可能是相同颜色的图像_).所以,我正在考虑这种方法,如果我可以使用NSColor对象(已经存在)创建一个NSImage对象,那么我可以使用NSMenuItem类的

-(void) setImage:(NSImage *) menuImage

方法在弹出按钮中显示颜色标题前面的图像.那么,如何使用NSColor完成创建NSImage对象?任何其他解决问题的方法也是受欢迎的.:)


War*_*ton 17

一个简单的类别方法将执行此操作

@interface NSImage (ImageAdditions)

+(NSImage *)swatchWithColor:(NSColor *)color size:(NSSize)size;


@end

@implementation NSImage (ImageAdditions)

+(NSImage *)swatchWithColor:(NSColor *)color size:(NSSize)size
{
    NSImage *image = [[[NSImage alloc] initWithSize:size] autorelease];
    [image lockFocus];
    [color drawSwatchInRect:NSMakeRect(0, 0, size.width, size.height)];
    [image unlockFocus];
   return image;    
}

@end
Run Code Online (Sandbox Code Playgroud)

[编辑]删除已弃用的API


Ben*_*ero 7

这是其他答案的Swift 5便捷初始化程序版本:

extension NSImage {
    convenience init(color: NSColor, size: NSSize) {
        self.init(size: size)
        lockFocus()
        color.drawSwatch(in: NSRect(origin: .zero, size: size))
        unlockFocus()
    }
}
Run Code Online (Sandbox Code Playgroud)

用法示例:

let redSwatchImage = NSImage(color: .red, size: NSSize(width: 128, height: 128))
Run Code Online (Sandbox Code Playgroud)

随时根据需要更改语义:)


M0r*_*3v5 5

以及上面的快速扩展变体:

import Cocoa

extension NSImage {
  class func swatchWithColor(color: NSColor, size: NSSize) -> NSImage {
    let image = NSImage(size: size)
    image.lockFocus()
    color.drawSwatchInRect(NSMakeRect(0, 0, size.width, size.height))
    image.unlockFocus()
    return image
  }
}
Run Code Online (Sandbox Code Playgroud)