绘制时 NSMenuItem 图像失真

NSMenuItem image is distorted when drawn

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

代码如下:

  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]];

如果我 select 来自子菜单的菜单项,NSPopupButton 会显示正确的图像。

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

但是菜单项看起来不对:

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

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

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

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

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