CALayer 中的图像未正确缩小并且存在抗锯齿问题
image in CALayer is not scaled down properly and has anti-aliasing issues
我正在学习 CALayer
并遇到以下问题。下面两张图
实际上在我的应用程序中有两个视图:左边的一个是 NSImageView
,右边的一个是图层托管 NSView
,其图像与内容相同。这是我用来设置的 ViewController
的代码:
import Cocoa
class ViewController: NSViewController {
@IBOutlet weak var aView: NSView!
@IBOutlet weak var anImage: NSImageView!
override func viewDidLoad() {
super.viewDidLoad()
let img = NSImage(named: "emptyStar")!
let l = CALayer()
l.contents = img
aView.layer = l
aView.wantsLayer = true
anImage.image = img
}
}
为什么 CALayer
图像看起来很糟糕,我该如何解决这个问题(坚持使用 CALayer
)?右图的放大图显示抗锯齿效果不佳。
我尝试过的是:1) 使用
生成 CGImage
img.CGImageForProposedRect(&aView.frame, context: nil, hints: [NSImageHintInterpolation: 3])
并将其设置为 l
的内容,2) 设置 l.contentsScale=2
,3) 设置 l.edgeAntialiasingMask=[.LayerLeftEdge, .LayerRightEdge, .LayerBottomEdge, .LayerTopEdge]
,4) 使 aView
层支持,通过移动 aView.wantsLayer=true
在 aView.layer = l
之前。我无法完成任何这些工作...
两个视图都是 50 x 50,而图像本身是我从本教程中抓取的 253 x 254 PNG 图像
https://developer.apple.com/library/content/referencelibrary/GettingStarted/DevelopiOSAppsSwift/
它在这个应用程序的资产中。
我很确定我在这里遗漏了一些简单的东西...
感谢您的帮助!
更新:
委托绘图似乎可行:
class ViewController: NSViewController {
@IBOutlet weak var aView: NSView!
override func drawLayer(layer: CALayer, inContext ctx: CGContext) {
NSGraphicsContext.setCurrentContext(NSGraphicsContext(CGContext: ctx, flipped: false))
NSImage(named: "emptyStar")!.drawInRect(layer.bounds)
}
override func viewDidLoad() {
super.viewDidLoad()
let l = CALayer()
l.delegate = self
aView.layer = l
aView.wantsLayer = true
aView.layer!.setNeedsDisplay()
}
}
希望有更好的解决方案来解决应该开箱即用的问题...
如果您没有使用正确的 min/mag 过滤器,您将得到混叠伪像。
由于您要将较大的图像放入较小的 CALayer,因此您需要使用线性、双线性或三线性过滤(按成本递增的顺序)。
对于图层,您可以使用以下方法设置最小过滤器:
layer.minificationFilter = kCAFilterTrilinear;
我正在学习 CALayer
并遇到以下问题。下面两张图
实际上在我的应用程序中有两个视图:左边的一个是 NSImageView
,右边的一个是图层托管 NSView
,其图像与内容相同。这是我用来设置的 ViewController
的代码:
import Cocoa
class ViewController: NSViewController {
@IBOutlet weak var aView: NSView!
@IBOutlet weak var anImage: NSImageView!
override func viewDidLoad() {
super.viewDidLoad()
let img = NSImage(named: "emptyStar")!
let l = CALayer()
l.contents = img
aView.layer = l
aView.wantsLayer = true
anImage.image = img
}
}
为什么 CALayer
图像看起来很糟糕,我该如何解决这个问题(坚持使用 CALayer
)?右图的放大图显示抗锯齿效果不佳。
我尝试过的是:1) 使用
生成CGImage
img.CGImageForProposedRect(&aView.frame, context: nil, hints: [NSImageHintInterpolation: 3])
并将其设置为 l
的内容,2) 设置 l.contentsScale=2
,3) 设置 l.edgeAntialiasingMask=[.LayerLeftEdge, .LayerRightEdge, .LayerBottomEdge, .LayerTopEdge]
,4) 使 aView
层支持,通过移动 aView.wantsLayer=true
在 aView.layer = l
之前。我无法完成任何这些工作...
两个视图都是 50 x 50,而图像本身是我从本教程中抓取的 253 x 254 PNG 图像
https://developer.apple.com/library/content/referencelibrary/GettingStarted/DevelopiOSAppsSwift/
它在这个应用程序的资产中。
我很确定我在这里遗漏了一些简单的东西...
感谢您的帮助!
更新: 委托绘图似乎可行:
class ViewController: NSViewController {
@IBOutlet weak var aView: NSView!
override func drawLayer(layer: CALayer, inContext ctx: CGContext) {
NSGraphicsContext.setCurrentContext(NSGraphicsContext(CGContext: ctx, flipped: false))
NSImage(named: "emptyStar")!.drawInRect(layer.bounds)
}
override func viewDidLoad() {
super.viewDidLoad()
let l = CALayer()
l.delegate = self
aView.layer = l
aView.wantsLayer = true
aView.layer!.setNeedsDisplay()
}
}
希望有更好的解决方案来解决应该开箱即用的问题...
如果您没有使用正确的 min/mag 过滤器,您将得到混叠伪像。
由于您要将较大的图像放入较小的 CALayer,因此您需要使用线性、双线性或三线性过滤(按成本递增的顺序)。
对于图层,您可以使用以下方法设置最小过滤器:
layer.minificationFilter = kCAFilterTrilinear;