如何将内存NSImage显示为Retina(@ 2x)?

时间:2014-07-24 23:24:52

标签: objective-c cocoa

我在NSMenuItem中显示动态加载的图片,如下图所示。

加载并调整图像为:

[menuItem setImage:[self processImage: [[NSImage alloc] url]]];
[menu addItem:menuItem];

processImage函数调整下载的88x88 px的大小。图像为24x24像素。 (如下图所示)。这使它看起来不像视网膜图片。但如果我把它保持在48x48px,它就不会像24x24一样小,所以NSMenuItem实际上并没有进行大小调整。

但是我需要以与48x48相同的视角显示这些图像。让它看起来像@ 2x。我无法找到一种方法来使用[NSMenuItem setImage:]方法来执行此操作,或者不将NSImage的内容保存为文件48x48,并使文件名以@2x结尾。

如果我在setImage:方法中使用48x48图像,NSMenuItem的高度只会增加两倍,它真正显示48点* 48点。

任何想法如何在不将内存图像保存到文件的情况下在NSMenuItem中实现视网膜图像?

3 个答案:

答案 0 :(得分:5)

仅对像素数大于此值的图像执行[image setSize:NSMakeSize(24, 24)]就足够了。 -setSize:以磅为单位设置其逻辑大小。图像中的表示确定它具有多少像素。如果像素尺寸大于点尺寸,那么还有更多细节。如果绘图目标也是高分辨率,则可以使用此详细信息。

如果这不起作用,您可以构建图像"手动"通过以所需大小初始化它,创建具有可用细节的位图图像表示,设置该副本的大小和像素尺寸(单独),并将该表示添加到图像。

答案 1 :(得分:0)

我可能会误解,但你不能期望将图像缩放到24x24并让它神奇地显示在视网膜48x48上。您最好将图像保持为48x48并在非视网膜屏幕上自动缩小(仅将图像大小设置为24x24)

答案 2 :(得分:0)

你可以使用类方法imageWithSize:flipped:drawingHandler:

这将调用您的drawingHandler,以便在需要时以正确的分辨率实际绘制图像。如果创建大小为24x24的NSImage,则在将图像复制到非视网膜屏幕之前,将调用drawingHandler绘制24x24像素。在将图像复制到retna屏幕上之前,将调用它来绘制48x48像素。

如果移动在视网膜和非视网膜显示之间绘制NSImage的窗口,将再次调用drawingHandler。