2012-06-26 43 views
4

我完全难倒了这里;我有一系列的小图片,我摆弄,使进入按钮:NSButton和NSImageView中的图像模糊

enter image description here

而且你可以看到他们都是体面的清晰和锐利,并保留这个时候我在预览打开PNG文件什么不是。

然而,当我在Interface Builder使用它们NSButtonsNSImageViews,设置缩放为None:

enter image description here

的图像变得模糊可怕。我究竟做错了什么?我不知道从哪里开始尝试;我应该回到图标并尝试使它们像素完美吗?这是否与抗锯齿或沿着这些线路有关?


编辑: 出于某种原因,它看起来好像NSButtons和NSImageViews加载图像的高分辨率版本,即使我是一个正常的显示,可以通过一个标识上我添加到他们轻微的浅蓝色中风。出于某种原因,Quartz Debug不会将它们识别为高分辨率图像,也不会有红色色调。删除对@ 2x图片的引用确实解决了这个问题......但是...

+0

你是Retina显示屏上观看图像?如果是这样,他们的大小和命名是否合适(@ 2x)? – warrenm

+0

这不是一个视网膜显示器,但我确实有@个2X命名的图像伴随着100%大小的图像! – Vervious

+0

尝试设置您的视图模式为方面适合 –

回答

5

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

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

3

我之前有过这个问题。看起来,如果您的图片的DPI不是72,则图片尺寸将会错误。您可以使用下面的代码获得实际大小。

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

那么,图像是72 dpi,代码产生正确的大小。 – Vervious

0

您是在IB还是在代码中将图像分配到Buttons

如果您使用的是代码,可能会创建一个图像副本(例如[myImage copy]),并将该副本分配给您的按钮可能会解决此问题。

+0

我使用IB,因为它在某些方面没有麻烦。 – Vervious

1

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

0

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

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

这实际上是较早响应发布关于新闻部,但我无法直接回复。该文章中的代码为我提供了真正的像素尺寸(也就是说,它没有表明任何麻烦)。然而,形象DPI绝对是我的案子的罪魁祸首。我看到的症状是:

  • 随着我的NSImageViews设置为无缩放,图像会出现压扁。
  • 将我的NSImageViews设置为Axes Independently,如果NSImageViews的尺寸设置为与图片的尺寸完全一致,则大多数图片都会正确显示。
  • 但是,即使在这种情况下,一些图像在它们当中通过Preview或其他地方(甚至通过Interface Builder,在它们仅在运行时出现)查看相同图像时,也不存在奇怪的人为因素。

有问题的图像是DPI而不是72.当我以72 DPI重新创建图像时,上述所有行为都消失了。

这是一个相当混乱的问题 - 我希望这可以帮助别人!

0

对于我来说,我只是需要的图像缩放设置为none:

在Interface Builder

enter image description here

在代码

NSImageCell *image; 
[image setImageScaling:NSImageScaleNone]; 

NSButtonCell *button; 
[button setImageScaling:NSImageScaleNone];