Что означает предлагаемое Rect в NSImage.cgImage(forProposedRect:context:hints:)?

Я изучаю этот метод, потому что я хотел бы преобразовать довольно большой NSImage в меньший CGImage, чтобы назначить его содержимому CALayer.

Из документации Apple я узнаю, что предполагаемый Rect должен быть размером CGImage, который будет возвращен, и что, если я передам nil для предлагаемого Rect я получу CGImage размером с исходный NSImage. (Пожалуйста, поправьте меня, если я ошибаюсь.)

Я пытался позвонить с nil для предложенного прямоугольника, и он отлично работает, но когда я пытаюсь дать ему какой-то прямоугольник, как (0,0,400,300)Полученный CGImage по-прежнему является размером исходного изображения. Код, который я использую, выглядит следующим образом.

var r = NSRect(x: 0, y: 0, width: 400, height: 300)
let img = NSImage(contentsOf: url)?.cgImage(forProposedRect: &r, context: nil, hints: nil)

В этом должно быть что-то, что я понял неправильно. Я действительно надеюсь, что кто-то может сказать мне, что это такое.

1 ответ

Решение

Этот метод не предназначен для получения масштабированных изображений. Основная идея заключается в том, что рисование NSImage к входному прямоугольнику в контексте дало бы определенный результат. Этот метод создает CGImage таким образом, что если бы он был нарисован в выходном прямоугольнике в том же контексте, он дал бы тот же результат.

Таким образом, метод вполне может вернуть CGImage размер исходного изображения. Масштабирование произойдет, когда это CGImage обращается к прямоугольнику

Существует некоторая документация по этому вопросу, которая существует только в исторических примечаниях к выпуску с момента ее появления. Поиск "Сопоставление импеданса NSImage, CGImage и CoreGraphics".

Чтобы получить уменьшенное изображение, вы должны создать новое изображение нужного размера, заблокировать на нем фокус и нарисовать на нем исходное изображение. Или, если вы не знали, вы можете просто назначить исходное изображение в качестве слоя contents и посмотрим, хватит ли производительности.

Другие вопросы по тегам