4

我在这里完全被难住了;我有一系列我正在修补并制作成按钮的小图像:

在此处输入图像描述

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

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

在此处输入图像描述

图像变得非常模糊。我究竟做错了什么?我不知道从哪里开始以及尝试什么;我应该回到图标并尝试使它们像素完美吗?它是否与抗锯齿或类似的东西有关?


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

4

7 回答 7

7

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

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

于 2012-07-05T08:20:32.143 回答
3

我以前有这个问题。看起来如果你的图像的 DPI 不是 72,那么图像大小就会出错。您可以使用下面的代码获得实际尺寸。

NSImage *image = [NSImage imageNamed:@"image"];
NSBitmapImageRep *rep = [NSBitmapImageRep imageRepWithData:[image TIFFRepresentation]];
NSSize size = NSMakeSize([rep pixelsWide], [rep pixelsHigh]);
[image setSize: size];
于 2012-06-26T07:46:29.240 回答
1

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

于 2012-11-07T13:57:35.947 回答
0

您是Buttons在 IB 中还是在 Code 中分配图像?

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

于 2012-06-26T14:34:42.990 回答
0

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

NSMakeRect( round(NSMinX(cellFrame)-iconSize.width), 
round(NSMidY(cellFrame)-(iconSize.height/2.0f)), …);
于 2012-12-27T12:33:39.387 回答
0

这实际上是对之前关于 DPI 的帖子的回应,但我无法直接回复它。那篇文章中的代码为我提供了真实的像素尺寸(也就是说,它没有表示任何问题)。但是,图像 DPI 绝对是我的罪魁祸首。我看到的症状是:

  • 当我的 NSImageViews 设置为 No Scaling 时,图像会被压扁。
  • 将我的 NSImageViews 设置为 Axes Independently,如果 NSImageViews 的尺寸设置为与图像的尺寸完全匹配,大多数图像都会正确显示。
  • 然而,即使在这种情况下,一些图像中也有奇怪的伪影,当通过 Preview 或其他地方(或者甚至通过 Interface Builder,就此而言——它们只出现在运行时)查看相同的图像时,这些伪影并不存在。

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

这是一个非常令人困惑的问题——我希望这对某人有所帮助!

于 2013-03-22T18:12:31.857 回答
0

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

在界面生成器中

在此处输入图像描述

在代码中

NSImageCell *image;
[image setImageScaling:NSImageScaleNone];

NSButtonCell *button;
[button setImageScaling:NSImageScaleNone];
于 2015-04-03T05:52:02.547 回答