4

我在 Mac 项目中有两个 PNG。正常和@2x。Xcode 将这些组合成一个 TIFF,@2x 位于索引 0,@1x 位于索引 1。

对于当前显示比例,获得适当图像作为 CGImageRef 版本(与 Quartz 一起使用)的建议方法是什么?

我可以通过 CGImageSource 手动获取图像:

NSBundle *mainBundle = [NSBundle mainBundle];
NSURL *URL = [mainBundle URLForResource:@"Canvas-Bkgd-Tile" withExtension:@"tiff"];

CGImageSourceRef source = CGImageSourceCreateWithURL((__bridge CFURLRef)(URL), NULL);
_patternImage = CGImageSourceCreateImageAtIndex(source, 1, NULL);  // index 1 is @1x, index 0 is @2x
CFRelease(source);

我也发现这是可行的,但我不确定这是否会在 Retina 显示器上返回 Retina 版本:

NSImage *patternImage = [NSImage imageNamed:@"Canvas-Bkgd-Tile.tiff"];
_patternImage = [patternImage CGImageForProposedRect:NULL context:nil hints:nil];
CGImageRetain(_patternImage); // retain image, because NSImage goes away

这个问题的一个可接受的答案或者提供了一个解决方案,如何从组合的多分辨率 TIFF 中获得合适的 CGImage,或者解释为什么这里的第二种方法有效。或者需要进行哪些更改。

4

1 回答 1

1

我选择回答“为什么这里的第二种方法有效”。

在自 2010 年以来发布的一个 WWDC 视频中,他们说:

+[NSImage imageNamed:]选择可用于当前显示的最佳图像表示对象。

所以很有可能你是在一个锁定的焦点上下文中调用这个类方法(例如在一个drawRect:方法或类似的方法中),或者你自己实际上调用了lockFocus。无论如何,结果是您获得了最合适的图像。但仅在调用+[NSImage imageNamed:]时。

编辑:在这里找到它:http: //adcdownload.apple.com//wwdc_2012/wwdc_2012_session_pdfs/session_213__introduction_to_high_resolution_on_os_x.pdf

在幻灯片中搜索关键字“best”:“NSImage 自动选择最佳表示 […]”。

因此,您的第二个版本将在 Retina 显示器上返回 Retina 版本,您可以确定,它在文档中被宣传 [*]。

[*] 这只有在您提供有效的艺术品时才有效。

于 2013-02-22T23:18:13.177 回答