Открыть сервис

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 →