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

8

如果我通过以下方式创建一个NSImage

NSImage *icon = [NSImage imageNamed:NSImageNameUser];

它只有一个表示形式,一个NSCoreUIImageRep,似乎是一个私有类。
我想将此图像存档为NSData,但如果我要求TIFFRepresentation,则会得到一个小图标,而最初创建的真正NSImage似乎是矢量的,并且可以缩放以填充我的图像视图。
我有点希望以这种方式制作的图像会有一个NSPDFImageRep,我可以使用它。
有什么想法如何获取此NSImageNSData(最好是矢量版本或较大的位图版本)?
更新
与一些人on Twitter交谈后,他们建议这些图像的真正来源是多分辨率icns文件(可能根本不是矢量)。我找不到这些文件在磁盘上的位置,但听起来很有趣。
此外,他们建议我创建系统NSImage,并手动将其渲染为我的高分辨率NSImage。我现在正在这样做,它对我的需求有效。我的代码:
+ (NSImage *)pt_businessDefaultIcon
{
    // Draws NSImageNameUser into a rendered bitmap. 
    // We do this because trying to create an NSData from 
    // [NSImage imageNamed:NSImageNameUser] directly results in a 32x32 image.
    NSImage *icon = [NSImage imageNamed:NSImageNameUser];
    NSImage *renderedIcon = [[NSImage alloc] initWithSize:CGSizeMake(PTAdditionsBusinessDefaultIconSize, PTAdditionsBusinessDefaultIconSize)];
    [renderedIcon lockFocus]; 
    NSRect inRect = NSMakeRect(0, 0, PTAdditionsBusinessDefaultIconSize, PTAdditionsBusinessDefaultIconSize);
    NSRect fromRect = NSMakeRect(0, 0, icon.size.width, icon.size.width);;
    [icon drawInRect:inRect fromRect:fromRect operation:NSCompositeCopy fraction:1.0];
    [renderedIcon unlockFocus];

    return renderedIcon;
}

我尝试将此作为我的答案发布,但是我没有足够的声望?


你的问题对我很有帮助,你的答案起作用了。 - Guillaume
2个回答

4
你似乎忽略了文档。你的两个主要问题都在那里得到了回答。Cocoa Drawing Guide(从NSImage API参考链接的附属指南)有一个图像部分,你需要仔细阅读并在任何时候都参考它,如果你遇到了重复/缓存/大小/质量问题。
与此问题相关的图像部分的子部分包括:如何选择图像表示形式、图像和缓存以及图像大小和分辨率。对于TIFF图像,默认情况下,-cacheMode“表现得好像NSImageCacheBySize设置正在生效。”另外,对于内存中的缩放/调整大小操作,-imageInterpolation很重要:“表6-4列出了可用的插值设置。”和“NSImageInterpolationHigh - 更慢、更高质量的插值。”
我非常确定这也适用于命名系统图像以及其他任何图像。
我原本希望通过从磁盘加载图像来创建的图像能够有一个可以使用的NSPDFImageRep。
相关子部分:图像表示。"...对于基于文件的图像,大多数您创建的图像只需要一个图像表示。"和"但是在以下情况下,您可能会创建多个表示:对于打印,您可能需要创建图像的PDF表示或高分辨率位图。"
您将获得适合所加载图像的表示。例如,对于TIFF图像,必须创建PDF表示。要以高分辨率这样做,您需要参考缓存模式,以便获取更高分辨率的项目。
由于图像/创建机制/设置/及您想要执行的所有操作的排列组合数量众多,因此有很多细节无法列举。我的帖子旨在为您找到特定信息提供一般指南。
要了解更多详细信息,请添加具体细节:您尝试使用的代码、您正在加载或创建的图像类型——您似乎在第四段中提到了两种不同的可能性——以及出了什么问题。

谢谢你提供的信息和文档链接。实际上,当我研究归档NSImages时,我没有遇到过这个。 - zorn

0
我猜测这个图像可能是与图形系统硬件连接并且NSImage表示仅仅是一个数字,指示它是哪个硬连接的图形。所以,你需要做的就是绘制它并捕获绘制。
一般来说,创建一个视图控制器来呈现图像,引用VC的“view”属性来使视图被呈现,提取VC的“contentView”,获取“contentView.layer”,将“layer”渲染到UIGraphics上下文中,从上下文获取“UIImage”,从“UIImage”中提取任何你想要的表示。
(也许有一种更简单的方法,但这是我在某些情况下使用的方法。)
(叹气,我想这种方案也无法保留缩放。)

很遗憾,你的缩放承认在这里是完全正确的。这不是一个通用的解决方案。事实上,对于所给出的事实,没有通用的解决方案。它取决于图像是如何创建的(在内存中还是从磁盘加载),它的缓存和插值设置是什么,以及现有的表示是否可以缩放或需要创建并绘制到具有所需大小/质量的新表示中。 - Joshua Nozzi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接