#cocoa #hidpi
#cocoa #hidpi
Вопрос:
Я загружаю изображение с разрешением 72 dpi в NSImageView, и оно выглядит очень размытым на дисплее HiDPI. Как добиться идеальной четкости изображения?
Я решил, что могу улучшить, добавив это совершенно бессмысленное переопределение в NSImageView, но это не исправляет его полностью.
public class CustomImageView: NSImageView {
public override func draw(_ dirtyRect: NSRect) {
super.draw(dirtyRect)
}
}
Вот как это выглядит по умолчанию:
С пользовательским переопределением:
Как показано в предварительном просмотре:
Ответ №1:
Я обнаружил, что могу исправить это, отключив интерполяцию изображений в графическом контексте. Это переопределение отключит интерполяцию, если размер изображения не превышает прямоугольник, поэтому оно будет выглядеть четким, если оно помещается в поле зрения, но сохраняет интерполяцию, если ее нужно уменьшить.
public class CustomImageView: NSImageView {
public override func draw(_ dirtyRect: NSRect) {
if let image = self.image, image.size.width <= dirtyRect.size.width amp;amp; image.size.height <= dirtyRect.size.height {
NSGraphicsContext.current?.cgContext.interpolationQuality = .none
}
super.draw(dirtyRect)
NSGraphicsContext.current?.cgContext.interpolationQuality = .default
}
}
Все еще интересуют какие-либо другие ответы или информация об этом. Я удивлен, что ничего не могу найти при поиске, похоже, для меня это обычная проблема.
Обновить
Настройка интерполяции непосредственно в NSGraphicsContext не работает в macOS 11 (возможно, ошибка в системе?). Это работает, только если вы нацелены на CGContext.