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

zor*_*orn 8 macos cocoa nsimage nsdata

如果我创建一个NSImage类似于:

NSImage *icon = [NSImage imageNamed:NSImageNameUser];
Run Code Online (Sandbox Code Playgroud)

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

我想把这个图像存档为NSData但如果我要求TIFFRepresentation我得到一个小图标,当NSImage我最初创建的真实图像似乎是矢量并且可以扩展以很好地填充我的图像视图.

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

任何想法我怎么能得到NSData(矢量版本或更大的位图版本)NSImage

UPDATE

在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;
}
Run Code Online (Sandbox Code Playgroud)

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

Jos*_*zzi 5

您的两个主要问题都在Cocoa 绘图指南(从 NSImage API 参考链接的配套指南)中得到了解答,其中有一个图像部分,您确实需要彻底阅读并在遇到代表/缓存/大小调整/质量问题时参考。

...如果我要求 TIFFRepresentation,当我最初创建的真实 NSImage 似乎是矢量并且会放大以很好地填充我的图像视图时,我会得到一个小图标。

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

我相当确定这适用于命名系统映像以及任何其他映像。

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

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

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

由于图像/创建机制/设置/以及您想要用它们做什么的大量排列,有很多细节无法列出我的帖子旨在提供一般指南,帮助您找到适合您的情况所需的具体信息。

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