【问题标题】:Easiest way to draw an NSImage dimmed out (like a disabled view)绘制 NSImage 变暗的最简单方法(如禁用视图)
【发布时间】:2010-11-25 11:31:45
【问题描述】:

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

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

【问题讨论】:

    标签: objective-c cocoa macos nsimage


    【解决方案1】:

    这对我来说很好用:

    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(...) 消除临时黑色图像]

    【讨论】:

    • 对你投反对票的人有点苛刻。这确实有效。投反对票的人可以做体面的事情并评论为什么吗? :)
    • 使用NSRectFillUsingOperationiconImage之上绘制可以去掉blackImage
    • 我自己就是这么想的。只需在已绘制图像的矩形顶部绘制一个半透明的深色矩形。基本上应该做同样的事情。即将重构。
    • Nikolai,你能举个例子吗?我认为我做错了,因为我只是得到一个黑色的大方块遮住了图像(它有透明区域)。可能我理解错了。
    • @d11wtq,@Nikolai:修复它。直到现在才知道NSRectFillUsingOperation(),谢谢尼古拉!完整地学习 Cocoa 肯定是一个终生的项目。 :)
    【解决方案2】:

    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
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-25
      • 2017-01-15
      • 2016-02-05
      • 1970-01-01
      • 1970-01-01
      • 2017-04-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多