绘制时 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 中完成。
(您也可以通过将混合模式更改为 NSCompositingOperationDarken
或 NSCompositingOperationPlusDarker
来修复它,但修复图像文件会更干净。)
我正在建立一个包含图像的子菜单项列表。我确实从包中加载了一张图片,然后想在菜单项样本中绘制它。
代码如下:
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 中完成。
(您也可以通过将混合模式更改为 NSCompositingOperationDarken
或 NSCompositingOperationPlusDarker
来修复它,但修复图像文件会更干净。)