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

问题描述 投票:0回答:2

如果我通过以下方式创建

NSImage

NSImage *icon = [NSImage imageNamed:NSImageNameUser];

它只有一种表示,一个

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

我想将此图像存档为

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

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

NSPDFImageRep

有什么想法我怎样才能得到这个

NSData
(首选矢量版本或更糟糕的是大比例位图版本)?

更新

在 Twitter 上与一些人交谈

,他们建议这些图像的真正来源是多分辨率 icns 文件(可能根本不是矢量)。我在磁盘上找不到这些文件的位置,但仍然很有趣。

此外,他们建议我创建系统 NSImage 并手动将其渲染为我自己的高分辨率 NSImage。我现在正在这样做,它可以满足我的需求。我的代码:

NSImage

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

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

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

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

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

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

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

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

有很多

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

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

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


0
投票
+ (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 中提取所需的任何表示。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.