【问题标题】:Trying to turn [NSImage imageNamed:NSImageNameUser] into NSData试图将 [NSImage imageNamed:NSImageNameUser] 变成 NSData
【发布时间】:2011-10-05 17:29:40
【问题描述】:

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

NSImage *icon = [NSImage imageNamed:NSImageNameUser];

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

我想将此图像存档为NSData,但如果我要求TIFFRepresentation,我会得到一个 当我最初创建的真实 NSImage 似乎是矢量时,小图标会放大以很好地填充我的图像视图。

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

任何想法如何获得这个NSImage 的NSData(首选矢量版本或更糟糕的大型位图版本)?

更新

与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;
}

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

【问题讨论】:

  • 你的问题对我很有用,你的回答很有效。

标签: macos cocoa nsdata nsimage


【解决方案1】:

您似乎忽略了文档。你的两个主要问题都在那里得到了回答。 Cocoa Drawing Guide(从 NSImage API 参考链接的配套指南)有一个图像部分,您确实需要仔细阅读,并在遇到代表/缓存/大小/质量问题时参考。

...如果我要求 TIFFRepresentation,我会在 我最初创建的真实 NSImage 似乎是矢量并且会缩放 最多可以很好地填充我的图像视图。

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

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

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

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

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

由于图像/创建机制/设置/的大量排列以及您想用它们做什么,有很多细节太多而无法列出。我的帖子旨在为查找您的情况所需的特定信息提供一般指南。

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

【讨论】:

  • 感谢您提供信息和文档链接。在研究归档 NSImages 时,我实际上并没有遇到这种情况。
【解决方案2】:

我猜图像以某种方式“硬连线”到图形系统中,它的 NSImage 表示只是一个数字,指示它是哪个硬连线图形。很可能您需要做的是绘制它,然后捕获绘图。

非常一般,创建一个将渲染图像的视图控制器,引用VC的view属性来渲染视图,提取VC的contentView,获取contentView.layer,渲染@987654324 @ 进入 UIGraphics 上下文,从上下文中获取 UIImage,从 UIImage 中提取您想要的任何表示。

(可能有一种更简单的方法,但这是我最终在一种情况下使用的方法。)

(而且,唉,我想这个方案也不保留缩放。)

【讨论】:

  • 不幸的是,您的缩放许可在这里完全正确。这不是一个通用的解决方案。事实上,对于给出的事实,没有普遍的解决方案。这取决于图像的创建方式(在内存中或从磁盘加载),其缓存和插值设置是什么,以及现有表示是否可以缩放或需要创建并绘制成具有所需大小的新表示/质量。
猜你喜欢
  • 1970-01-01
  • 2012-07-28
  • 1970-01-01
  • 2011-08-16
  • 2011-08-11
  • 1970-01-01
  • 1970-01-01
  • 2023-03-05
  • 1970-01-01
相关资源
最近更新 更多