1

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

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

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

这是默认情况下的外观:

默认

使用自定义覆盖:

改善

如预览中所示:

预览

4

1 回答 1

1

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

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

于 2020-11-06T07:44:32.280 回答