试图将[NSImage imageNamed:NSImageNameUser]转换为NSData
如果我通过类似的方式创建一个NSImage
:
NSImage *icon = [NSImage imageNamed:NSImageNameUser];
它只有一个表示,一个NSCoreUIImageRep
,它似乎是一个私有类。
我想将此图像存档为NSData
但如果我要求TIFFRepresentation
当我最初创建的真正NSImage
看起来像是矢量时,我会看到一个小图标,并且可以放大以充分填充图像视图。
我有点希望这样做的图像会有一个NSPDFImageRep
我可以使用。
任何想法如何获得NSImage
的NSData
(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#