我发现我可以通过在图形上下文中禁用图像插值来解决这个问题。只要图像不大于绘制矩形,此覆盖将禁用插值,因此如果它适合视图,它会看起来很清晰,但如果需要按比例缩小,则保留插值。
public class CustomImageView: NSImageView {
public override func draw(_ dirtyRect: NSRect) {
if let image = self.image, image.size.width <= dirtyRect.size.width && image.size.height <= dirtyRect.size.height {
NSGraphicsContext.current?.cgContext.interpolationQuality = .none
}
super.draw(dirtyRect)
NSGraphicsContext.current?.cgContext.interpolationQuality = .default
}
}
仍然对有关此的任何其他答案或信息感兴趣。我很惊讶我在搜索时找不到任何东西,这对我来说似乎是一个常见问题。
更新
直接在 NSGraphicsContext 上设置插值不适用于 macOS 11(可能是系统中的错误?)。它仅在您以 cgContext 为目标时才有效。