【问题标题】:NSMenuItem image is distorted when drawnNSMenuItem 图像在绘制时失真
【发布时间】:2020-12-11 19:21:03
【问题描述】:

我正在建立一个包含图像的子菜单项列表。我确实从包中加载了一个图像,然后想在菜单项样本中绘制它。

代码如下:

  NSMenuItem *item = [[NSMenuItem alloc] initWithTitle:@"Title" action:nil keyEquivalent:@""];

  [item setAction:@selector(action:)];
  [item setTarget:self];
  [item setEnabled:YES];

  NSImage *img = [[NSImage alloc] initWithSize:NSMakeSize(24, 16)];

  [img lockFocus];

  NSString *imgFile = [mainBundle pathForResource:@"swatch" ofType: @"png"];
  NSImage *swtch = [[NSImage alloc] initWithContentsOfFile:imgFile];

  NSRect imgRect;
  imgRect.origin = NSZeroPoint;
  imgRect.size = [swtch size];
  [swtch drawInRect:NSMakeRect(0, 0, 24, 16)
           fromRect:imgRect
          operation:NSCompositingOperationSourceOver
           fraction:1.0f];

  [img unlockFocus];

  [item setImage:[img copy]];

如果我从子菜单中选择菜单项,NSPopupButton 会显示正确的图像。

如果我从“img”获得位图表示,那是正确的,是“swtch”的缩小副本。

但是菜单项看起来不对:

它只是在大苏尔开始的,以前一切看起来都很好。 我需要设置不同的菜单项或其单元格吗?

【问题讨论】:

    标签: objective-c image nsmenuitem macos-big-sur


    【解决方案1】:

    看起来问题出在图像本身。它可能有一个 alpha 通道,但文本边缘周围的抗锯齿是在白色背景上合成的(很难解释,但它可以而且确实会发生,具体取决于图像的制作方式。)

    此图像是否总是在白色背景上绘制?如果是这样,请尝试重新保存不透明的 .png 文件。您可以在 Preview.app 中执行此操作。文件->导出,取消选中Alpha。

    如果您需要在任何彩色背景上正确合成的黑色抗锯齿文本,则需要重做图像,使其中没有白色。这可以在 Photoshop 中完成。

    (您也可以通过将混合模式更改为NSCompositingOperationDarkenNSCompositingOperationPlusDarker 来修复它,但修复图像文件会更干净。)

    【讨论】:

    • 图像是 PNG 但没有 alpha 通道。背景为纯白色。如您所述,尝试“删除 Alpha 通道”,但不存在“Alpha”选项。我通过将图像替换为实际具有 alpha 通道并且它就在那里的图像来确认。使用的图像在过去一年没有变化,但区别在于之前的 Catalina 和当前的 Big Sur macOS 版本。
    • 如果我添加一个透明背景的图像,一切都很好(除了背景丢失,显然),没有失真。尝试了不同的背景颜色,没有区别。编译应用时捆绑图像不会更改。
    • 最后,我想我需要尝试其他图像编辑程序(除了 Preview 和 AffinityDesigner/Photo),但是用白色背景填充目标图像并使用 NSCompositingOperationDarken 解决了这个问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-16
    • 1970-01-01
    • 2011-04-09
    • 1970-01-01
    • 1970-01-01
    • 2013-03-25
    • 1970-01-01
    相关资源
    最近更新 更多