Что означает предлагаемое 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
и посмотрим, хватит ли производительности.