В Objective-C (OS X) пространство координат "глобального отображения", используемое Quartz Display Services, совпадает с пространством координат "экрана" Какао?
Я пытаюсь создать изображение "лупа" для своего приложения, которое можно использовать для проверки изображений с различными уровнями увеличения, и я столкнулся с небольшим дорожным ударом. Я использую Кварц, чтобы создать CGImageRef
снимок выбранной части экрана, окно моего приложения включено. Проблема в том, что номенклатура, используемая всеми различными технологиями OS X, действительно запутала меня.
Я использую функцию CGDisplayCreateImageForRect(CGDirectDisplayID display, CGRect rect)
, В документации говорится CGRect rect
Параметр - это "прямоугольник, указанный в области отображения, для части экрана, копируемой в изображение". Проблема в том, что вывод, который я получаю в своей консоли, не соответствует ожиданиям. Я пробовал так много разных преобразований, трансформаций, сальто и т. Д., Что теперь я на 100% запутался.
Итак, я предполагаю, что мой вопрос сводится к следующему: отображает ли пространство экрана == пространство устройства == пространство экрана и как правильно преобразовать координаты своего кадра (который является пользовательским окном без полей) координат (источник слева внизу)), чтобы соответствовать координат дисплея (левый верхний начало)?
Если бы кто-то мог направить меня прямо или направить меня в правильном направлении, я был бы всегда благодарен. Спасибо!
1 ответ
Кварц использует координатное пространство, где начало координат (0, 0) находится в верхнем левом углу основного дисплея. Увеличение у идет вниз.
Какао использует координатное пространство, где начало координат (0, 0) находится в левом нижнем углу основного дисплея, а увеличение y увеличивается.
Вы можете преобразовать рамку окна из Какао в Кварц следующим образом:
NSRect frame = window.frame;
frame.origin.y = NSMaxY(NSScreen.screens[0].frame) - NSMaxY(frame);
CGRect quartzRect = NSRectToCGRect(frame);
Примечание: вы не используете окна -screen
Вы всегда используете основной экран.
Это для прямоугольника в координатах окна. Для прямоугольника в виде сначала преобразуйте координаты вида в координаты окна, используя -[NSView convertRect:toView:]
с nil
как вид назначения, обозначающий окно. Это сделало бы правильную вещь для someView.bounds
но не для someView.frame
, поскольку кадр вида находится в системе координат суперпредставления.