如果我通过以下方式创建
NSImage
:
NSImage *icon = [NSImage imageNamed:NSImageNameUser];
它只有一种表示,一个
NSCoreUIImageRep
,它似乎是一个私有类。
我想将此图像存档为
NSData
但如果我要求 TIFFRepresentation
我会得到一个
当我最初创建的真实NSImage
似乎是矢量时的小图标,并且会放大以很好地填充我的图像视图。
我有点希望用这种方式制作的图像会有一个我可以使用的
NSPDFImageRep
。
有什么想法我怎样才能得到这个
NSData
(首选矢量版本或更糟糕的是大比例位图版本)?更新
在 Twitter 上与一些人交谈
,他们建议这些图像的真正来源是多分辨率 icns 文件(可能根本不是矢量)。我在磁盘上找不到这些文件的位置,但仍然很有趣。此外,他们建议我创建系统 NSImage 并手动将其渲染为我自己的高分辨率 NSImage。我现在正在这样做,它可以满足我的需求。我的代码:
NSImage
(试图将此作为我的答案,但我没有足够的声誉?)
您的两个主要问题都在
...如果我要求 TIFFRepresentation,当 我最初创建的真实 NSImage 似乎是矢量并且可以缩放 足以很好地填充我的图像视图。
我相当确定这适用于命名系统映像以及任何其他映像。此问题的图像部分的相关小节是:如何选择图像表示、图像和缓存以及图像大小和分辨率。默认情况下,TIFF 图像的 -cacheMode 的行为就像 NSImageCacheBySize 设置生效一样。此外,对于内存中的缩放/大小调整操作,-imageInterpolation 也很重要:“表 6-4 列出了可用的插值设置。”和“NSImageInterpolationHigh - 更慢,更高质量的插值。”
我有点希望[通过从磁盘加载图像]制作的图像能够 有一个我可以使用的 NSPDFImageRep。
您将获得适合加载图像的表示形式。例如,您必须为 TIFF 图像创建 PDF 表示形式。要以高分辨率执行此操作,您需要返回缓存模式,以便获得更高分辨率的项目。相关小节:图像表示。 “...使用基于文件的图像,您创建的大多数图像只需要单个图像表示。”和“但是,在以下情况下您可能会创建多个表示形式:为了打印,您可能需要创建图像的 PDF 表示形式或高分辨率位图。”
有很多
的细节无法列出,因为图像/创建机制/设置/的排列以及你想用它们做什么。我的帖子旨在提供一般指南,帮助您查找适合您情况所需的具体信息。
有关更多详细信息,请添加具体细节:您尝试使用的代码、您正在加载或创建的图像类型 - 您似乎在第四段中提到了两种不同的可能性 - 以及出了什么问题。
我猜测图像以某种方式“硬连线”到图形系统中,并且它的 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;
}
属性来渲染视图,提取 VC 的
view
,获取
contentView
,将 contentView.layer
渲染到UIGraphics 上下文,从上下文中获取 layer
,从 UIImage 中提取所需的任何表示。(可能有一种更简单的方法,但这是我最终在一个案例中使用的方法。)
(而且,叹息,我想这个方案也不能保持缩放。)