NSImageView 72dpi 图像在 HiDPI 显示器上模糊

NSImageView 72dpi image blurry on HiDPI display

我正在将 72dpi 图像加载到 NSImageView 中,它在 HiDPI 显示器上看起来非常模糊。它如何才能呈现出完美的清晰度?

我发现我可以通过将这个完全没有意义的覆盖添加到 NSImageView 来改进,但它并没有完全修复它。

public class CustomImageView: NSImageView {
    public override func draw(_ dirtyRect: NSRect) {
        super.draw(dirtyRect)
    }
}

这是默认情况下的样子:

自定义覆盖:

在预览中呈现:

我发现我可以通过在图形上下文中禁用图像插值来解决这个问题。只要图像不大于绘制矩形,此覆盖就会禁用插值,因此如果它适合视图,它看起来会很清晰,但如果需要缩小,它会保留插值。

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 为目标时才有效。