NSButton和NSImageView中的图像模糊

时间:2012-06-26 05:01:24

标签: objective-c macos image cocoa interface-builder

我完全被这里难过;我有一系列小图像,我正在修补和制作按钮:

enter image description here

正如你所看到的那样,它们都非常清晰锐利,并且在我打开预览中的png文件时保留了这一点。

但是,当我在Interface Builder中的NSButtonsNSImageViews中使用它们时,将Scaling设置为None:

enter image description here

图像变得非常模糊。我究竟做错了什么?我不知道从哪里开始和尝试什么;我应该回到图标并尝试让它们像素完美吗?是否与抗锯齿或其他方面有关?


修改 出于某种原因,似乎NSButtons和NSImageViews正在加载图像的高分辨率版本,即使我在正常显示器上,可以通过我添加到它们的轻微浅蓝色笔划来识别。出于某种原因,Quartz Debug不会将这些识别为高分辨率图像,并且没有红色调。删除对@ 2x图像的引用确实解决了问题......但是......

7 个答案:

答案 0 :(得分:5)

如果您在WWDC 2012的第一部分的Advanced Tips and Tricks for High Resolution on OS X视频NSImage中查看会话245,您就会找到原因。

NSImage没有任何高分辨率的概念 - 它只使用像素所占空间的最小像素 - 所以如果你的NSImageView尺寸大于你的1x图像,它将使用2x图像,因为它有更多的像素。

答案 1 :(得分:3)

我以前遇到过这个问题。似乎如果您的图像的DPI不是72,则图像尺寸将是错误的。您可以使用下面的代码获得实际大小。

NSImage *image = [NSImage imageNamed:@"image"];
NSBitmapImageRep *rep = [NSBitmapImageRep imageRepWithData:[image TIFFRepresentation]];
NSSize size = NSMakeSize([rep pixelsWide], [rep pixelsHigh]);
[image setSize: size];

答案 2 :(得分:1)

在Interface Builder和[NSImage imageNamed:]中指定图像名称时,请务必使用foo代替foo.png。虽然iOS足够聪明,可以在后一种情况下添加@2x,但Mac OS X则不然。它会在后一种情况下加载非视网膜图像,但会在第一种情况下添加@2x(如果存在这样的图像)。

答案 3 :(得分:0)

您是在IB或代码中将图像分配给Buttons吗?

如果您是在代码中执行此操作,可能会创建图像的副本(例如[myImage copy]),并将该副本分配给您的按钮可能会解决此问题。

答案 4 :(得分:0)

在我的情况下(在自定义NSOutlineView中绘制图标),我必须确保drawRect的x,y原点被舍入为int值:

NSMakeRect( round(NSMinX(cellFrame)-iconSize.width), 
round(NSMidY(cellFrame)-(iconSize.height/2.0f)), …);

答案 5 :(得分:0)

这实际上是对早先关于DPI的帖子的回应,但我无法直接回复它。该帖子中的代码为我提供了真正的像素尺寸(也就是说,它没有表明任何问题)。然而,图像DPI绝对是我案件的罪魁祸首。我看到的症状是:

  • 当我的NSImageViews设置为No Scaling时,图像会显得压扁。
  • 如果我的NSImageViews独立设置为Axes,如果NSImageViews的尺寸设置为与图像尺寸完全匹配,大多数图像都会正确显示。
  • 然而,即使在这种情况下,一些图像中也存在奇怪的文物,当通过预览或其他地方查看相同的图像时(或者甚至通过Interface Builder,它们只出现在运行时),它们不存在。< / LI>

有麻烦的图像是72以外的DPI。当我以72 DPI重新创建图像时,上述所有行为都消失了。

这是一个相当混乱的问题 - 我希望这有助于某人!

答案 6 :(得分:0)

对我来说,我只需要将图像缩放设置为无:

在Interface Builder中

enter image description here

代码

NSImageCell *image;
[image setImageScaling:NSImageScaleNone];

NSButtonCell *button;
[button setImageScaling:NSImageScaleNone];