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