Core Graphics — bu nədir, iş prinsipləri və 2D qrafika üçün freymvork

Müəllif: IT Sectr Dərc olunub: 2026-07-21 Oxuma vaxtı: 10 dəq

Core Graphics — Apple-dan 2D renderinq freymvorku, Core Foundation tərkibinə daxildir və iOS, macOS, tvOS və watchOS-da mövcuddur. O, vektor və rastr qrafikası ilə işləmək üçün aşağı səviyyəli C-API təmin edir, o cümlədən konturların, qradientlərin, kölgələrin, təsvirlərin və mətnin çəkilməsi. Core Graphics UIKit, SwiftUI və AppKit üçün əsas rolunu oynayır. Apple Developer Documentation, 2026 məlumatına görə, freymvork iOS tətbiqlərinin 90%-dən çoxunda istifadə olunur, çünki hər görünən element Core Graphics və ya onun aparat analoqundan keçir.

Əsas məqamlar

  • Core Graphics — vektor və rastr renderinqi üçün Apple-ın fundamental 2D freymvorku.
  • CGContext — bütün rəsm əməliyyatlarının icra olunduğu mərkəzi obyekt.
  • CGPath — müxtəlif kontekstlərdə təkrar istifadə üçün dəyişməz vektor konturu.
  • CGGradient — rəng fəzalarını dəstəkləyən xətti və radial qradientlər yaratmaq üçün obyekt.
  • CGImage — çəkilə, transformasiya oluna və maskalana bilən rastr təsviri.

Core Graphics nədir?

Core Graphics (Quartz 2D kimi də tanınır) — Apple-ın 2D qrafik mühərrikini həyata keçirən freymvorkdur. O, portativ Quartz qrafik kitabxanasına əsaslanır və səhifə əsaslı rəsm modelindən (page-based) istifadə edir, burada hər bir hərəkət kağız üzərində çəkməyi xatırladan ardıcıllıqda bir əmrdir. Core Graphics anti-aliasing, şəffaflıq (alpha compositing) və ICC rəng fəzalarını dəstəkləyir.

Core Graphics arxitekturası qrafik kontekst (CGContext) ətrafında qurulmuşdur, o hədəf çıxış cihazını — ekran, printer, PDF sənədi və ya rastr buferini inkapsulyasiya edir. Kontekst cari parametrləri idarə edir: rəng, xətt qalınlığı, transformasiya, kəsmə sahəsi və şriftlər. Bu yanaşma rəsm kodunu dəyişmədən müxtəlif çıxış cihazları üçün vahid API təmin edir.

Core Graphics əsasən CPU-da işləyir, vektor modelindən (resolution-independent) istifadə edərək. Bu o deməkdir ki, xətlər və əyrilər render zamanı cihazın cari rezolyusiyası ilə rastrlaşdırılır. Metal-dan fərqli olaraq, Core Graphics GPU resurslarının açıq idarə edilməsini tələb etmir — bütün optimallaşdırmanı sistem öz üzərinə götürür. Əksər 2D tapşırıqları (qrafika, diaqramlar, fərdi UI elementləri) üçün Core Graphics performansı 60 FPS saxlamaq üçün kifayətdir.

Arxitektura və əsas tiplər

Core Graphics təxminən 50 əsas tipdən (opaque types) ibarətdir, hər biri müəyyən funksionallığa cavabdehdir. Bütün tiplər Core Foundation yaddaş idarəetmə qaydalarına əməl edir: adında Create olan funksiyalar vasitəsilə yaradılır, CGRelease çağırışı tələb edir və Objective-C-də ARC-uyğun deyil (lakin Swift CF_RETURNS_RETAINED annotasiyaları vasitəsilə yaddaşı avtomatik idarə edir).

Core Graphics-ın əsas tipləri

CGContext — rəsm konteksti, freymvorkun mərkəzi tipi. CGPath — dəyişməz vektor konturu. CGColor — rəng fəzası göstərilən rəng. CGGradient — qradient doldurma. CGImage — rastr təsviri. CGLayer — təkrar çəkmə üçün optimallaşdırılmış oflayn bufer. CGDataProvider — təsvirlər üçün məlumat mənbəyi. CGColorSpace — rəng fəzası (sRGB, Display P3, Gray).

Hər tip minimal overhead üçün hazırlanmışdır: CGPath müxtəlif kontekstlər arasında keşlənə və təkrar istifadə oluna bilər, CGColor ötürülərkən GPU-nun aparat təmsilinə çevrilir, CGLayer əvvəlcədən rastrlaşdırılmış məzmunu saxlayır. Belə bir arxitektura Core Graphics-ın həm sadə UI tapşırıqlarında, həm də peşəkar qrafik redaktorlarında səmərəli işləməsinə imkan verir.

TipTəyinatYaddaş idarəetməsi
CGContextQrafik kontekstCFRelease və ya Swift-də avtomatik
CGPathVektor konturuCFRelease (dəyişməz)
CGColorRəng fəzasında rəngCFRelease və ya CGColorCreate
CGImageRastr təsviriCFRelease (yaradıldıqdan sonra)
CGLayerOflayn buferCFRelease və ya CGLayerCreate

CGPath: vektor konturları və onların optimallaşdırılması

CGPath — həndəsi seqmentlərin ardıcıllığını təsvir edən dəyişməz obyekt: düz xətlər, Bezier əyriləri, qövslər və bağlanmalar. UIBezierPath-dən fərqli olaraq, CGPath rəsm metodlarını ehtiva etmir — o yalnız həndəsəni saxlayır. Çəkmək üçün CGPath kontekstə əlavə edilir (CGContextAddPath) və sonra strokePath və ya fillPath vasitəsilə çəkilir. Dəyişməzlik thread təhlükəsizliyini və keşləmə imkanını təmin edir.

Konturların yaradılması və optimallaşdırılması

CGPathCreateMutable mərhələli qurma üçün dəyişən yol (CGMutablePathRef) yaradır. Son yığımadan sonra dəyişməz CGPathRef-ə çevrilir. Apple CGPath-də nöqtələrin sayını minimuma endirməyi tövsiyə edir — çox mürəkkəb konturlar (1000-dən çox seqment) rastrlaşdırmanı ləngidir. Optimallaşdırma üçün artıq kollinear nöqtələri silən CGPathCreateCopyBySimplifyingPath istifadə edin.

İki CGPath arasında forma animasiyası üçün CAShapeLayer-in path xüsusiyyətində CABasicAnimation istifadə edilə bilər. Məhdudiyyət: hər iki CGPath eyni sayda seqmentə (controls points) malik olmalıdır. CGPathApply funksiyası yolun bütün elementlərini keçməyə və onların strukturunu müqayisə etməyə imkan verir. Seqmentlər uyğun gəlmirsə, animasiya sıçrayışlı olacaq — bu halda nöqtələrin əl ilə interpolyasiyası üçün CADisplayLink istifadə edin.

swift
// dəyişən yol yarat
let mutablePath = CGMutablePath()
mutablePath.moveTo(to: CGPoint(x: 0, y: 0))
mutablePath.addLine(to: CGPoint(x: 100, y: 0))
mutablePath.addLine(to: CGPoint(x: 100, y: 100))
mutablePath.closeSubpath()

// təhlükəsiz keşləmə üçün dəyişməzə çevir
let immutablePath: CGPath = mutablePath
CATransaction.perform {
    shapeLayer.path = immutablePath
}

Qradientlər: CGGradient və CGShading

CGGradient — düz xətt boyunca (xətti qradient) və ya mərkəzdən kənarlara (radial qradient) iki və ya daha çox rəng arasında hamar keçidi təyin edən obyekt. CGGradient rəng fəzası, CGColorRef massivi və 0.0-dan 1.0-a qədər dayanma mövqeləri massivi göstərilməklə yaradılır. Yaradıldıqdan sonra qradient müxtəlif kontekstlərdə dəfələrlə istifadə edilə bilər.

Qabaqcıl qradientlər üçün CGShading

CGShading — yol boyunca rəng dəyişmə funksiyasını təyin etməyə imkan verən daha güclü mexanizmdir. Sabit rəng dəsti ilə işləyən CGGradient-dən fərqli olaraq, CGShading hər nöqtədə rəngi hesablayan callback funksiyasından (CGFunctionRef) istifadə edir. Bu, qeyri-xətti keçidlər və mürəkkəb rəng sxemləri ilə mürəkkəb qradientlər yaratmağa imkan verir.

Fiqurun daxilində qradient çəkmək üçün həmin fiqurun konturunda clip tələb olunur. Sıra: kontekstə yol əlavə edin, CGContextClip çağırın, sonra qradienti çəkin. Clip olmadan qradient bütün konteksti doldurur. iOS-da daha sadə və məhsuldar variant kimi CGGradient istifadə etmək tövsiyə olunur — CGShading yalnız qeyri-standart rəng dəyişmə funksiyaları üçün əsaslandırılır.

swift
func drawGradient(ctx: CGContext, rect: CGRect) {
    let colors = [UIColor.red.cgColor, UIColor.blue.cgColor] as CFArray
    guard let gradient = CGGradient(
        colorsSpace: CGColorSpaceCreateDeviceRGB(),
        colors: colors,
        locations: [0.0, 1.0]
    ) else { return }

    ctx.saveGState()
    ctx.addEllipse(in: rect)
    ctx.clip()
    ctx.drawLinearGradient(
        gradient,
        start: CGPoint(x: rect.midX, y: rect.minY),
        end: CGPoint(x: rect.midX, y: rect.maxY),
        options: []
    )
    ctx.restoreGState()
}

Təsvirlərlə iş: CGImage və CGLayer

CGImage — Core Graphics-da rastr təsviri, fayldan yüklənə, proqramlı şəkildə yaradıla və ya UIImage-dən əldə edilə bilər. CGImage piksel məlumatları, rəng fəzası, ölçü, bit dərinliyi və məlumat yerləşməsi haqqında məlumatları ehtiva edir. UIImage-dən fərqli olaraq, CGImage Retina üçün miqyaslamanı idarə etmir — bu məsuliyyəti proqramçı scale parametri vasitəsilə öz üzərinə götürür.

CGLayer — təkrar çəkmənin optimallaşdırılması

CGLayer — statik məzmunun əvvəlcədən rastrlaşdırılması üçün oflayn buferdir. Eyni qrafik əmrlər dəsti dəfələrlə çəkilirsə (məsələn, fon nümunəsi), CGLayer onu bir dəfə rastrlaşdırır və sonra sadəcə kontekstə kopyalayır. Apple məlumatlarına görə, CGLayer istifadəsi təkrar çəkməni CPU-da 2–5 dəfə, aparat sürətləndirilməsi ilə 10 dəfəyə qədər sürətləndirə bilər.

Təsvirləri yükləmək üçün CGImageSource istifadə edin — metadata, miniatürlər və GIF/APNG-dən ayrı-ayrı kadrları oxumaq üçün güclü API. CGImageSource təsviri proqressiv yükləməyə və yalnız lazımi fraqmentləri əldə etməyə imkan verir. Böyük təsvirlərlə (ekran ölçüsünü aşan) işləyərkən diskdə keşləmə seçimi ilə CGImageSource yaratmaq və kiçildilmiş versiyanı göstərmək üçün CGImageSourceCreateThumbnailAtIndex istifadə etmək tövsiyə olunur.

swift
func createLayer(ctx: CGContext, size: CGSize) -> CGLayer? {
    guard let layer = CGLayer(ctx, size: size, auxiliaryInfo: nil) else { return nil }
    let layerCtx = layer.context !

    // bir dəfə çək
    layerCtx.setFillColor(UIColor.lightGray.cgColor)
    layerCtx.addEllipse(in: CGRect(origin: .zero, size: size))
    layerCtx.fillPath()
    return layer
}

// draw() istifadəsi
for i in 0..<20 {
    ctx.draw(layer, at: CGPoint(x: CGFloat(i) * 30, y: 0))
}

Core Graphics ilə iş nümunəsi

Core Graphics istifadə edərək təsvirdə su nişanı göstərmək üçün fərdi View hazırlayaq. Su nişanı orijinal təsvirin üzərinə qoyulmuş yarı şəffaf mətn və vektor loqosunu ehtiva edir. Kod bir kontekstdə CGContext, CGImage, mətn və şəffaflıqla işi nümayiş etdirir.

swift
class WatermarkView: UIView {

    private let watermarkText = "IT Sectr"
    private let watermarkOpacity: CGFloat = 0.3

    override func draw(_ rect: CGRect) {
        guard let ctx = UIGraphicsGetCurrentContext() else { return }

        // fon təsvirini çək
        UIImage(named: "background")?.draw(in: rect)

        // su nişanı şəffaflığını konfiqurasiya et
        ctx.saveGState()
        ctx.translateBy(x: rect.midX, y: rect.midY)
        ctx.rotate(by: -.pi / 6)

        // yarı şəffaf mətn
        let attributes: NSAttributedString.Attributes = [
            .font: UIFont.boldSystemFont(ofSize: 48),
            .foregroundColor: UIColor.white.withAlphaComponent(watermarkOpacity)
        ]
        let textSize = watermarkText.size(withAttributes: attributes)
        watermarkText.draw(
            at: CGPoint(x: -textSize.width / 2, y: -textSize.height / 2),
            withAttributes: attributes
        )

        // mətnin altında vektor ikonu (dairə xaç ilə)
        ctx.setStrokeColor(UIColor.white.withAlphaComponent(watermarkOpacity).cgColor)
        ctx.setLineWidth(3)
        ctx.addEllipse(in: CGRect(x: -25, y: -75, width: 50, height: 50))
        ctx.strokePath()
        ctx.moveTo(x: -15, y: -50)
        ctx.addLineTo(x: 15, y: -50)
        ctx.moveTo(x: 0, y: -65)
        ctx.addLineTo(x: 0, y: -35)
        ctx.strokePath()

        ctx.restoreGState()
    }
}

Kodda Core Graphics-ın əsas imkanlarından istifadə olunub: saveGState/restoreGState su nişanı effektlərini fondan təcrid etmək üçün, translateBy və rotate yerləşdirmə və döndərmə üçün, withAlphaComponent vasitəsilə yarı şəffaf mətn və addEllipse və addLineTo vasitəsilə vektor ikonu. Bütün su nişanı fon təsvirindən sonra vahid kompozisiya kimi çəkilir.

İstehsalda fotoşəkillər üçün su nişanları yaradarkən performansı nəzərə almaq vacibdir. Təsvir ekrandan böyükdürsə, su nişanını tətbiq etməzdən əvvəl onu CGImageSourceCreateThumbnailAtIndex vasitəsilə kiçildin. Core Graphics bütün əməliyyatları CPU-da emal edir — onlarla təsvirin toplu emalı üçün UI bloklanmasının qarşısını almaq üçün fon növbəsi və CGBitmapContext istifadə edin.

Tez-tez verilən suallar

Core Graphics UIKit-dən nə ilə fərqlənir?

UIKit — yüksək səviyyəli UI freymvorku, renderinq üçün daxilində Core Graphics istifadə edir. Core Graphics — 2D qrafika üçün aşağı səviyyəli C-API. UIKit standart elementlər üçün daha rahatdır, Core Graphics hər piksel üzərində tam nəzarət verir.

Nə vaxt Core Graphics əvəzinə Metal istifadə etməli?

Core Graphics statik 2D qrafika, diaqramlar və fərdi UI elementləri üçün uyğundur. Metal — 3D qrafika, mürəkkəb animasiyalar və GPU sürətləndirilməsi ilə böyük piksel massivlərinin emalı üçün. UI tapşırıqlarının 95%-i üçün Core Graphics kifayətdir.

CGImage ilə işləyərkən yaddaşı necə qənaət etmək olar?

Tam yükləmə əvəzinə miniatürləri yükləmək üçün CGImageSource-dan createThumbnailAtIndex vasitəsilə istifadə edin. Böyük təsvirləri göstərmək üçün downsample seçimi ilə CGImage yaradın. CGImage artıq lazım olmadıqda CGImageRelease vasitəsilə azad edin.

Core Graphics PDF-i dəstəkləyir?

Bəli, Core Graphics oxumaq üçün CGPDFDocument və PDF sənədləri yaratmaq üçün CGPDFContext vasitəsilə tam PDF dəstəyi daxildir. İstənilən CGContext məzmununu vektorları saxlayaraq birbaşa PDF səhifəsinə çəkmək olar.

Rəsm çəkərkən Retina keyfiyyətini necə təmin etmək olar?

Core Graphics ekranda render edərkən avtomatik olaraq cihazın rezolyusiyasından istifadə edir. Oflayn kontekstlər üçün scale = 0 parametri ilə (sistem miqyası) UIGraphicsBeginImageContextWithOptions istifadə edin və ya Retina/Retina HD üçün açıq şəkildə 2.0/3.0 göstərin.

Nəticə

  • Core Graphics — CPU-da vektor və rastr renderinqi üçün Apple-ın fundamental 2D freymvorku.
  • CGContext — vəziyyət yığınını və hədəf çıxış cihazını idarə edən mərkəzi obyekt.
  • CGPath — təhlükəsiz keşləmə və thread-safe təkrar istifadə üçün dəyişməz vektor konturları.
  • CGGradientCGShading — xətti, radial və funksional qradientlər yaratmaq mexanizmləri.
  • CGImage — müxtəlif rəng fəzaları və bit dərinliyi dəstəyi ilə rastr təsvirləri.
  • CGLayer — təkrar çəkməni 2–5 dəfə sürətləndirmək üçün oflayn bufer.
  • Core Graphics UIKit, SwiftUI və AppKit üçün əsas rolunu oynayır — iOS-da hər görünən element ondan keçir.

Açar təslim mobil tətbiq hazırlayacağıq

IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.

Layihəni müzakirə et

Həm də oxuyun