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

如果我通过类似的方式创建一个NSImage

NSImage *icon = [NSImage imageNamed:NSImageNameUser];

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

我想将此图像存档为NSData但如果我要求TIFFRepresentation当我最初创建的真正NSImage看起来像是矢量时,我会看到一个小图标,并且可以放大以充分填充图像视图。

我有点希望这样做的图像会有一个NSPDFImageRep我可以使用。

任何想法如何获得NSImageNSData (pref矢量版本或更糟糕的大规模位图版本)?

UPDATE

在推特上与一些人一起,他们建议这些图像的真正来源是多分辨率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;
}

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


你似乎忽略了文档。 这两个主要问题都在那里回答。 Cocoa制图指南(链接自NSImage API参考的配套指南)有一个图像部分,您需要彻底阅读并参考任何时候您有代表/缓存/大小/质量问题。

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

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

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

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

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

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

由于图像/创建机制/设置的大量排列以及您想要如何处理所有内容,因此列出的许多细节太多。 我的博文是为了找到你所需要的具体信息的一般指南。

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


我猜想图像是以某种方式“硬连线”到图形系统中的,并且它的NSImage表示仅仅是一个数字,表示它是哪一种硬连线图形。 所以你需要做的就是绘制它然后捕获绘图。

非常一般地,创建将呈现图像视图控制器,参考VC的view属性使视图被呈现,提取contentView的VC的,得到contentView.layer ,使layer成UIGraphics上下文中,得到UIImage从上下文中,从UIImage中提取你想要的任何表示。

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

(而且,叹气,我想这个方案也不能保持缩放。)

链接地址: http://www.djcxy.com/p/55227.html

上一篇: Trying to turn [NSImage imageNamed:NSImageNameUser] into NSData

下一篇: What is the best way to read an attribute from an xml string in c#