Изображение NSImageView 72dpi размыто на дисплее HiDPI

#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.