Core Graphics
Core Graphics (также известный как Quartz 2D) — это программный интерфейс (API) для двумерной (2D) векторной и растровой графики, входящий в состав операционных систем Apple (macOS, iOS, iPadOS, tvOS, watchOS). Он является частью фреймворка Quartz и предоставляет низкоуровневые средства для отрисовки графических примитивов, работы с изображениями, цветом, шрифтами и преобразованиями координат. Core Graphics лежит в основе визуального рендеринга многих приложений Apple, включая системные интерфейсы и сторонние программы, написанные на Objective-C, Swift или C.
История
Core Graphics был разработан компанией Apple в конце 1990-х — начале 2000-х годов как часть перехода к операционной системе macOS (тогда Mac OS X). Его предшественником был QuickDraw — классический 2D-графический API для классической Mac OS, который использовал растровую модель и был ориентирован на аппаратные возможности процессоров Motorola 68k. С появлением Mac OS X (2001 год) Apple внедрила Quartz — новую графическую архитектуру, основанную на модели отображения с использованием PDF (Portable Document Format). Core Graphics стал ядром этой архитектуры, обеспечивая рендеринг векторных и растровых элементов.
В 2007 году с выходом первой версии iOS (тогда iPhone OS) Core Graphics был портирован на мобильные устройства, став основным API для 2D-графики в iOS. В последующих версиях iOS и macOS API расширялся: добавлялись новые типы контекстов, улучшалась поддержка цветовых пространств (например, широкий цветовой охват Display P3 в iOS 10 и macOS Sierra 2016 года), а также интеграция с аппаратным ускорением через Metal.
Архитектура и основные компоненты
Core Graphics работает на уровне C-функций, что обеспечивает высокую производительность и совместимость с языками C, C++, Objective-C и Swift (через мосты). API не является объектно-ориентированным в традиционном смысле — он использует непрозрачные типы данных (opaque types), такие как CGContextRef, CGPathRef, CGImageRef, CGColorRef, CGFontRef и другие.
Контекст рисования
Центральным элементом Core Graphics является контекст рисования (CGContextRef). Контекст представляет собой виртуальное полотно, на которое выполняются все графические операции. Он определяет:
- Целевое изображение (растровое изображение, экран, PDF-файл, окно);
- Текущие параметры рисования (цвет, толщина линии, стиль заливки, режим смешивания);
- Систему координат и преобразования (масштабирование, поворот, сдвиг).
Стандартный способ получения контекста — вызов функции UIGraphicsGetCurrentContext() (в UIKit) или создание контекста для конкретного вывода (например, CGBitmapContextCreate для растрового изображения).
Графические примитивы
Core Graphics поддерживает рисование следующих примитивов:
- Линии и кривые: прямые линии, кривые Безье (квадратичные и кубические), дуги окружностей;
- Фигуры: прямоугольники, эллипсы, многоугольники;
- Пути (
CGPathRef): комбинации линий и кривых, которые могут быть замкнутыми или разомкнутыми; - Текст: рендеринг шрифтов через
CGContextShowTextAtPointили с использованием Core Text (более высокоуровневый API); - Изображения: вставка растровых изображений (
CGImageRef) с возможностью масштабирования, обрезки и наложения эффектов.
Цвет и цветовые пространства
Цвет в Core Graphics задаётся через CGColorRef и CGColorSpaceRef. Поддерживаются цветовые пространства:
- sRGB (стандартное для большинства экранов);
- Display P3 (широкий цветовой охват, используется в современных устройствах Apple);
- Gray (оттенки серого);
- CMYK (для печати);
- Lab и ICC-профили (через ColorSync).
Преобразования координат
Core Graphics использует аффинные преобразования (CGAffineTransform), которые позволяют изменять положение, масштаб и ориентацию объектов. Преобразования могут быть применены как ко всему контексту, так и к отдельным путям или изображениям. Типичные операции: CGContextTranslateCTM, CGContextScaleCTM, CGContextRotateCTM.
Растровые изображения
Работа с растровыми изображениями осуществляется через CGImageRef. Core Graphics поддерживает:
- Создание изображений из данных (например, из PNG, JPEG);
- Обрезку, масштабирование и поворот;
- Применение масок (альфа-канал);
- Извлечение метаданных (разрешение, цветовое пространство, ориентация).
Для создания растрового контекста используется CGBitmapContextCreate, который принимает параметры: размер, количество бит на компонент, количество компонентов, порядок байтов и цветовое пространство.
Применение
Core Graphics широко применяется в разработке приложений для платформ Apple:
Отрисовка пользовательских интерфейсов
В iOS и macOS разработчики используют Core Graphics для создания кастомных элементов интерфейса: кнопок, индикаторов прогресса, фонов, анимаций. Например, метод drawRect: в UIView (iOS) или draw(_:) в NSView (macOS) позволяет переопределить отрисовку с помощью Core Graphics.
Работа с PDF
Core Graphics включает функции для создания и чтения PDF-документов (CGPDFDocumentRef, CGPDFPageRef). Это позволяет приложениям генерировать PDF-файлы из графических элементов или отображать страницы PDF на экране.
Обработка изображений
API используется для манипуляции растровыми изображениями: изменение размера, наложение фильтров (через Core Image), объединение нескольких изображений, извлечение цветовых каналов.
Графика для игр и визуализаций
Хотя для сложной 3D-графики и игр обычно используется Metal или OpenGL, Core Graphics применяется для 2D-интерфейсов, спрайтов и простых анимаций в играх, написанных на SpriteKit или SceneKit.
Печать
Core Graphics поддерживает вывод на принтеры через CGContext для печати. Это используется в приложениях для создания отчётов, этикеток и других печатных материалов.
Сравнение с другими API
Core Graphics является низкоуровневым API по сравнению с более высокоуровневыми фреймворками Apple:
- UIKit (iOS) и AppKit (macOS) предоставляют готовые элементы интерфейса, которые внутри используют Core Graphics для отрисовки.
- Core Animation (CALayer) автоматизирует анимацию и композицию слоёв, но для кастомного рисования внутри слоя всё равно вызывается Core Graphics.
- SpriteKit и SceneKit предназначены для игр и 3D-сцен, но их 2D-рендеринг может задействовать Core Graphics.
- Metal — низкоуровневый API для GPU, который может использоваться для высокопроизводительной графики, но Core Graphics остаётся основным для 2D-интерфейсов.
Производительность и ограничения
Core Graphics выполняет большую часть работы на CPU, что может быть узким местом при сложной отрисовке (например, тысячи объектов). Для повышения производительности Apple рекомендует:
- Минимизировать количество вызовов функций Core Graphics в цикле отрисовки;
- Использовать кэширование результатов через
CGLayerили растровые контексты; - Перекладывать тяжёлые операции на GPU через Core Image или Metal.
Ограничения Core Graphics включают отсутствие прямого доступа к GPU (в отличие от Metal) и сложность работы с прозрачностью и смешиванием в некоторых цветовых пространствах.
Пример использования
Ниже приведён упрощённый пример на Swift, демонстрирующий отрисовку красного круга с помощью Core Graphics в контексте UIView:
``swift override func draw(_ rect: CGRect) { guard let context = UIGraphicsGetCurrentContext() else { return } context.setFillColor(UIColor.red.cgColor) context.addEllipse(in: CGRect(x: 50, y: 50, width: 100, height: 100)) context.fillPath() } ``
Интересные факты
- Core Graphics является частью Quartz — архитектуры, названной в честь кварцевых часов, символизирующих точность и надёжность.
- PDF-модель Core Graphics позволяет экспортировать любой графический контекст в PDF-файл без потери качества.
- В macOS Core Graphics может использовать аппаратное ускорение через Quartz Extreme, но на мобильных устройствах это ограничено.
Источники
- Apple Developer Documentation: Core Graphics Framework
- «Programming with Quartz: 2D and PDF Graphics in Mac OS X» by David Gelphman, Bunny Laden
- WWDC Session Videos (Apple, 2010–2023)
- iOS and macOS Human Interface Guidelines (Apple, 2024)
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →