试图将[NSImage imageNamed:NSImageNameUser]转换为NSData

时间:2011-10-05 17:29:41

标签: macos cocoa nsdata nsimage

如果我通过以下内容创建NSImage

NSImage *icon = [NSImage imageNamed:NSImageNameUser];

它只有一个表示,NSCoreUIImageRep似乎是私人类。

我想将此图片归档为NSData,但如果我要求TIFFRepresentation我得到了 我最初创建的真实NSImage似乎是矢量的小图标,可以扩展以很好地填充我的图像视图。

我有点希望以这种方式制作的图像会有NSPDFImageRep我可以使用。

任何想法如何才能获得此NSData的{​​{1}}(矢量版本或更大的位图版本)?

更新

与一些人on Twitter说话,他们建议这些图像的真正来源是多分辨率icns文件(可能根本不是矢量)。我无法在磁盘上找到这些位置,但听到的却很有趣。

此外,他们建议我创建系统NSImage并手动将其渲染为我自己的高分辨率NSImage。我现在正在这样做,它正在满足我的需求。我的代码:

NSImage

(试图发布这个作为我的答案,但我没有足够的声誉?)

2 个答案:

答案 0 :(得分:4)

您似乎忽略了文档。你的两个主要问题都在那里得到解答。 Cocoa Drawing Guide(从NSImage API参考链接的伴随指南)有一个图像部分,您需要仔细阅读并参考任何时候您有rep / caching / sizing / quality问题。

  

...如果我要求TIFFRepresentation,我会得到一个小图标   我最初创建的真正的NSImage似乎是矢量并且可以扩展   最好能很好地填充我的图像视图。

此问题的图像部分的相关小节是:如何选择图像表示,图像和缓存,以及图像大小和分辨率。默认情况下,TIFF图像的-cacheMode“就像NSImageCacheBySize设置有效一样。”此外,对于内存中缩放/大小调整操作,-imageInterpolation很重要:“表6-4列出了可用的插值设置。”和“NSImageInterpolationHigh - 更慢,更高质量的插值。”

我很确定这适用于指定的系统映像以及任何其他映像。

  

我有点希望[通过从磁盘加载图像]制作的图像   有一个我可以使用的NSPDFImageRep。

相关小节:图像表示。 “......使用基于文件的图像,您创建的大多数图像只需要一个图像表示。”并且“您可能会在以下情况下创建多个表示形式,但是:对于打印,您可能需要创建图像的PDF表示或高分辨率位图。”

您将获得适合加载图像的表示。例如,您必须为TIFF图像创建PDF表示。要以高分辨率执行此操作,您需要返回缓存模式,以便获得更高分辨率的项目。

由于图像/创建机制/设置的大量排列/以及您想要用它们做什么,因此有很多很多的精细细节无法列出。我的帖子旨在成为查找您所需的具体信息的一般指南。

有关更多详细信息,请添加特定详细信息:您尝试使用的代码,您正在加载或创建的图像类型 - 您似乎在第四段中提到了两种不同的可能性 - 以及出了什么问题。

答案 1 :(得分:0)

我猜想图像以某种方式“硬连线”进入图形系统,而它的NSImage表示只是一个数字,表示它是哪个硬连线图形。您可能需要做的就是绘制它然后捕获绘图。

通常,创建一个视图控制器来渲染图像,引用VC的view属性以使视图呈现,提取VC的contentView,得到{{1} },将contentView.layer渲染到UIGraphics上下文中,从上下文中获取layer,从UIImage中提取您想要的任何表示。

(可能有一种更简单的方法,但这是我最终在一个案例中使用的方式。)

(并且,叹了口气,我想这个方案也没有保留缩放。)