proposedRect在NSImage.cgImage中的含义是什么(forProposedRect:context:hints :)?

时间:2018-03-31 13:09:34

标签: swift macos cocoa nsimage cgimage

我正在研究这种方法,因为我想将一个相当大的NSImage转换为一个较小的CGImage,以便将它分配给CALayer的内容。

Apple's documentation我得到的是,nomRect应该是将要返回的CGImage的大小,如果我通过nil for proposedRect,我将获得一个CGImage的大小最初的NSImage。 (如果我错了,请纠正我。)

我尝试用nil为建议的矩形调用它并且它完美地运行,但是当我尝试给它一些像(0,0,400,300)这样的矩形时,生成的CGImage仍然是原始图像的大小。我正在使用的代码如下。

var r = NSRect(x: 0, y: 0, width: 400, height: 300)
let img = NSImage(contentsOf: url)?.cgImage(forProposedRect: &r, context: nil, hints: nil)

我必须对此有所了解,我理解错了。我真的希望有人能告诉我那是什么。

1 个答案:

答案 0 :(得分:1)

此方法不适用于生成缩放图像。基本思想是在上下文中将NSImage绘制到输入rect会产生一定的结果。这个方法会创建一个CGImage,如果在同一个上下文中将绘制到输出矩形,它会产生相同的结果。

因此,返回CGImage原始图像大小的方法完全有效。将CGImage绘制到矩形时会发生缩放。

有一些关于此的文档仅在historical release notes首次引入时才存在。搜索“NSImage,CGImage和CoreGraphics阻抗匹配”。

要生成缩小的图像,您应该创建所需大小的新图像,将焦点锁定在其上,然后将原始图像绘制到该图像上。或者,如果您不知道,您可以将原始图像指定为图层的contents,并查看其是否具有足够的效果。