CALayer中的图像未正确缩小并具有抗锯齿问题

时间:2016-09-17 00:23:06

标签: macos cocoa calayer

我正在了解CALayer并遇到以下问题。以下两张图片

enter image description here

实际上是我的应用中的两个视图:左边的一个是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)通过移动{{1}使aView层支持在aView.wantsLayer=true之前。我不能做任何这些工作......

两个视图都是50 x 50,而图像本身是我从本教程中获取的253 x 254 PNG图像

https://developer.apple.com/library/content/referencelibrary/GettingStarted/DevelopiOSAppsSwift/

它位于此应用的资产中。

我很确定我在这里错过了一些简单的东西......

感谢您的帮助!

更新: 委托图纸似乎有效:

aView.layer = l

希望有一个更好的解决方案可以解决这个问题......

1 个答案:

答案 0 :(得分:3)

如果您没有使用正确的min / mag过滤器,您将会出现锯齿现象。

由于您要将较大的图像放入较小的CALayer中,因此您需要使用线性,双线性或三线性过滤(按成本递增顺序)。

对于图层,您可以使用以下方式设置最小过滤器:

layer.minificationFilter = kCAFilterTrilinear;