Core Graphics Apple کا 2D رینڈرنگ فریم ورک ہے، جو Core Foundation کا حصہ ہے اور iOS، macOS، tvOS اور watchOS پر دستیاب ہے۔ یہ ویکٹر اور راسٹر گرافکس کے ساتھ کام کرنے کے لیے نچلی سطح کی C API فراہم کرتا ہے، جس میں پاتھ، گریڈینٹ، شیڈو، امیجز اور ٹیکسٹ ڈرائنگ شامل ہے۔ Core Graphics UIKit، SwiftUI اور AppKit کی بنیاد کے طور پر کام کرتا ہے۔ Apple Developer Documentation، 2026 کے مطابق، یہ فریم ورک 90% سے زیادہ iOS ایپس میں استعمال ہوتا ہے، کیونکہ ہر دکھائی دینے والا عنصر Core Graphics یا اس کے ہارڈویئر مساوی سے گزرتا ہے۔
اہم نکات
Core Graphics (Quartz 2D کے نام سے بھی جانا جاتا ہے) ایک فریم ورک ہے جو Apple کے 2D گرافکس انجن کو لاگو کرتا ہے۔ یہ Quartz پورٹیبل گرافکس لائبریری پر مبنی ہے اور صفحہ پر مبنی ڈرائنگ ماڈل استعمال کرتا ہے، جہاں ہر عمل ایک ترتیب میں ایک کمانڈ ہے جو کاغذ پر ڈرائنگ جیسی ہے۔ Core Graphics اینٹی الیاسنگ، شفافیت (الفا کمپوزٹنگ) اور ICC کلر اسپیس کو سپورٹ کرتا ہے۔
Core Graphics کا آرکیٹیکچر ایک گرافکس سیاق (CGContext) کے گرد بنایا گیا ہے جو ہدف آؤٹ پٹ ڈیوائس — اسکرین، پرنٹر، PDF دستاویز یا راسٹر بفر کو انکیپسلیٹ کرتا ہے۔ سیاق موجودہ ترتیبات کو منظم کرتا ہے: رنگ، لائن کی موٹائی، تبدیلی، کلپنگ ایریا اور فونٹس۔ یہ نقطہ نظر ڈرائنگ کوڈ کو تبدیل کیے بغیر مختلف آؤٹ پٹ ڈیوائسز کے لیے یکساں API فراہم کرتا ہے۔
Core Graphics بنیادی طور پر CPU پر کام کرتا ہے، ویکٹر ماڈل (ریزولوشن سے آزاد) استعمال کرتے ہوئے۔ اس کا مطلب ہے کہ لائنیں اور منحنی خطوط ڈرائنگ کے وقت موجودہ ڈیوائس ریزولوشن پر راسٹرائز کیے جاتے ہیں۔ Metal کے برعکس، Core Graphics کو واضح GPU وسائل کے انتظام کی ضرورت نہیں ہے — سسٹم تمام اصلاح کو سنبھالتا ہے۔ زیادہ تر 2D کاموں (گرافکس، چارٹ، کسٹم UI عناصر) کے لیے، Core Graphics کی کارکردگی 60 FPS برقرار رکھنے کے لیے کافی ہے۔
Core Graphics میں تقریباً 50 بنیادی اقسام (مبہم اقسام) شامل ہیں، ہر ایک مخصوص فعالیت کے لیے ذمہ دار ہے۔ تمام اقسام Core Foundation میموری مینجمنٹ کے قواعد پر عمل کرتی ہیں: یہ نام میں Create والے فنکشنز کے ذریعے بنائی جاتی ہیں، CGRelease کال کی ضرورت ہوتی ہیں، اور Objective-C میں ARC-مطابق نہیں ہیں (تاہم Swift CF_RETURNS_RETAINED تشریحات کے ذریعے خود بخود میموری کا انتظام کرتا ہے)۔
CGContext — ڈرائنگ سیاق، فریم ورک کی مرکزی قسم۔ CGPath — ایک ناقابل تبدیلی ویکٹر پاتھ۔ CGColor — مخصوص کلر اسپیس کے ساتھ رنگ۔ CGGradient — گریڈینٹ بھرائی۔ CGImage — ایک راسٹر امیج۔ CGLayer — بار بار ڈرائنگ کے لیے بہتر بنایا گیا آف لائن بفر۔ CGDataProvider — تصاویر کے لیے ڈیٹا کا ذریعہ۔ CGColorSpace — ایک کلر اسپیس (sRGB, Display P3, Gray)۔
ہر قسم کم سے کم اوور ہیڈ کے لیے ڈیزائن کی گئی ہے: CGPath کو کیش کیا جا سکتا ہے اور مختلف سیاق و سباق کے درمیان دوبارہ استعمال کیا جا سکتا ہے، CGColor کو پاس کرتے وقت GPU ہارڈویئر نمائندگی میں تبدیل کیا جاتا ہے، CGLayer پہلے سے راسٹرائزڈ مواد کو ذخیرہ کرتا ہے۔ یہ آرکیٹیکچر Core Graphics کو سادہ UI کاموں اور پیشہ ورانہ گرافکس ایڈیٹرز دونوں میں مؤثر طریقے سے کام کرنے کی اجازت دیتا ہے۔
| قسم | مقصد | میموری مینجمنٹ |
|---|---|---|
| CGContext | گرافکس سیاق | CFRelease یا Swift میں خودکار |
| CGPath | ویکٹر پاتھ | CFRelease (ناقابل تبدیلی) |
| CGColor | کلر اسپیس میں رنگ | CFRelease یا CGColorCreate |
| CGImage | راسٹر امیج | CFRelease (بنانے کے بعد) |
| CGLayer | آف لائن بفر | CFRelease یا CGLayerCreate |
CGPath ایک ناقابل تبدیلی آبجیکٹ ہے جو ہندسی حصوں کی ترتیب کو بیان کرتا ہے: سیدھی لائنیں، بیزیئر منحنی خطوط، قوس اور بندش۔ UIBezierPath کے برعکس، CGPath میں ڈرائنگ کے طریقے نہیں ہیں — یہ صرف جیومیٹری کو ذخیرہ کرتا ہے۔ ڈرائنگ کے لیے، CGPath کو سیاق میں شامل کیا جاتا ہے (CGContextAddPath) اور پھر strokePath یا fillPath کے ذریعے رینڈر کیا جاتا ہے۔ ناقابل تبدیلی تھریڈ سیفٹی اور کیشنگ کی صلاحیت کو یقینی بناتی ہے۔
CGPathCreateMutable مرحلہ وار تعمیر کے لیے ایک قابل تبدیلی پاتھ (CGMutablePathRef) بناتا ہے۔ حتمی اسمبلی کے بعد، اسے ناقابل تبدیلی CGPathRef میں تبدیل کیا جاتا ہے۔ Apple CGPath میں پوائنٹس کی تعداد کو کم سے کم کرنے کی سفارش کرتا ہے — بہت پیچیدہ پاتھ (1000 سے زیادہ حصے) راسٹرائزیشن کو سست کر دیتے ہیں۔ اصلاح کے لیے، CGPathCreateCopyBySimplifyingPath استعمال کریں، جو بے کار کولینیئر پوائنٹس کو ہٹاتا ہے۔
دو CGPath آبجیکٹس کے درمیان شکل کو حرکت دینے کے لیے، آپ CAShapeLayer کی path پراپرٹی پر CABasicAnimation استعمال کر سکتے ہیں۔ حد: دونوں CGPath میں ایک جتنے حصے (کنٹرول پوائنٹس) ہونے چاہئیں۔ CGPathApply فنکشن آپ کو پاتھ کے تمام عناصر کو ٹریورس کرنے اور ان کی ساخت کا موازنہ کرنے کی اجازت دیتا ہے۔ اگر حصے مماثل نہیں ہوتے ہیں، تو اینیمیشن جھٹکے دار ہوگی — اس صورت میں، دستی پوائنٹ انٹرپولیشن کے لیے CADisplayLink استعمال کریں۔
// قابل تبدیلی پاتھ بنائیں
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()
// محفوظ کیشنگ کے لیے ناقابل تبدیلی میں تبدیل کریں
let immutablePath: CGPath = mutablePath
CATransaction.perform {
shapeLayer.path = immutablePath
}
CGGradient ایک آبجیکٹ ہے جو سیدھی لکیر کے ساتھ (لکیری گریڈینٹ) یا مرکز سے باہر کی طرف (ریڈیل گریڈینٹ) دو یا زیادہ رنگوں کے درمیان ہموار منتقلی کی وضاحت کرتا ہے۔ CGGradient مخصوص کلر اسپیس، CGColorRef کی اری اور 0.0 سے 1.0 تک سٹاپ پوزیشنز کی اری کے ساتھ بنایا جاتا ہے۔ بنانے کے بعد، گریڈینٹ کو مختلف سیاق و سباق میں کئی بار دوبارہ استعمال کیا جا سکتا ہے۔
CGShading ایک زیادہ طاقتور میکانزم ہے جو پاتھ کے ساتھ رنگ تبدیل کرنے کے فنکشن کی وضاحت کرنے کی اجازت دیتا ہے۔ CGGradient کے برعکس، جو رنگوں کے ایک مقررہ سیٹ کے ساتھ کام کرتا ہے، CGShading ایک کال بیک فنکشن (CGFunctionRef) استعمال کرتا ہے جو ہر پوائنٹ پر رنگ کا حساب لگاتا ہے۔ یہ غیر لکیری منتقلی اور مرکب رنگ سکیموں کے ساتھ پیچیدہ گریڈینٹ بنانے کے قابل بناتا ہے۔
کسی شکل کے اندر گریڈینٹ کھینچنے کے لیے، اس شکل کے پاتھ پر ایک کلپ ضروری ہے۔ ترتیب: سیاق میں پاتھ شامل کریں، CGContextClip کو کال کریں، پھر گریڈینٹ کھینچیں۔ کلپ کے بغیر، گریڈینٹ پورے سیاق کو بھر دیتا ہے۔ iOS میں، CGGradient کو آسان اور زیادہ کارکردگی والے آپشن کے طور پر تجویز کیا جاتا ہے — CGShading صرف کسٹم کلر فنکشنز کے لیے موزوں ہے۔
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()
}
CGImage Core Graphics میں ایک راسٹر امیج ہے جسے فائل سے لوڈ کیا جا سکتا ہے، پروگرام کے ذریعے بنایا جا سکتا ہے یا UIImage سے حاصل کیا جا سکتا ہے۔ CGImage میں پکسل ڈیٹا، کلر اسپیس کی معلومات، سائز، بٹ گہرائی اور ڈیٹا لے آؤٹ شامل ہوتا ہے۔ UIImage کے برعکس، CGImage Retina اسکیلنگ کا انتظام نہیں کرتا — یہ ذمہ داری scale پیرامیٹر کے ذریعے ڈویلپر پر آتی ہے۔
CGLayer جامد مواد کی پہلے سے راسٹرائزیشن کے لیے ایک آف لائن بفر ہے۔ اگر ڈرائنگ کمانڈز کا ایک ہی سیٹ بار بار انجام دیا جاتا ہے (مثال کے طور پر، بیک گراؤنڈ پیٹرن)، CGLayer اسے ایک بار راسٹرائز کرتا ہے اور پھر اسے سیاق میں کاپی کر دیتا ہے۔ Apple کے مطابق، CGLayer کا استعمال بار بار ڈرائنگ کو CPU پر 2–5 گنا اور ہارڈویئر ایکسلریشن کے ساتھ 10 گنا تک تیز کر سکتا ہے۔
تصاویر لوڈ کرنے کے لیے، CGImageSource استعمال کریں — GIF/APNG سے میٹا ڈیٹا، تھمب نیلز اور انفرادی فریم پڑھنے کے لیے ایک طاقتور API۔ CGImageSource ترتیبی لوڈنگ اور صرف ضروری حصوں کو حاصل کرنے کی اجازت دیتا ہے۔ بڑی تصاویر (اسکرین سائز سے بڑی) کے ساتھ کام کرتے وقت، ڈسک کیشنگ کے ساتھ CGImageSource بنانے اور چھوٹا ورژن دکھانے کے لیے CGImageSourceCreateThumbnailAtIndex استعمال کرنے کی سفارش کی جاتی ہے۔
func createLayer(ctx: CGContext, size: CGSize) -> CGLayer? {
guard let layer = CGLayer(ctx, size: size, auxiliaryInfo: nil) else { return nil }
let layerCtx = layer.context !
// ایک بار ڈرا کریں
layerCtx.setFillColor(UIColor.lightGray.cgColor)
layerCtx.addEllipse(in: CGRect(origin: .zero, size: size))
layerCtx.fillPath()
return layer
}
// draw() میں استعمال
for i in 0..<20 {
ctx.draw(layer, at: CGPoint(x: CGFloat(i) * 30, y: 0))
}
آئیے Core Graphics استعمال کرتے ہوئے تصویر پر واٹر مارک دکھانے کے لیے ایک کسٹم View بنائیں۔ واٹر مارک میں شامل ہے اصل تصویر کے اوپر نیم شفاف متن اور ایک ویکٹر لوگو۔ کوڈ ایک ہی سیاق میں CGContext، CGImage، متن اور شفافیت کے ساتھ کام کو ظاہر کرتا ہے۔
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 }
// پس منظر کی تصویر ڈرا کریں
UIImage(named: "background")?.draw(in: rect)
// واٹر مارک شفافیت ترتیب دیں
ctx.saveGState()
ctx.translateBy(x: rect.midX, y: rect.midY)
ctx.rotate(by: -.pi / 6)
// نیم شفاف متن
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
)
// متن کے نیچے ویکٹر آئیکن (صلیب کے ساتھ دائرہ)
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()
}
}
کوڈ Core Graphics کی اہم صلاحیتوں کا استعمال کرتا ہے: پس منظر سے واٹر مارک اثرات کو الگ کرنے کے لیے saveGState/restoreGState، پوزیشننگ اور گردش کے لیے translateBy اور rotate، withAlphaComponent کے ذریعے نیم شفاف متن، اور addEllipse اور addLineTo کے ذریعے ویکٹر آئیکن۔ پورا واٹر مارک پس منظر کی تصویر کے بعد ایک کمپوزیشن کے طور پر کھینچا جاتا ہے۔
پروڈکشن میں تصاویر کے لیے واٹر مارک بناتے وقت کارکردگی پر غور کرنا ضروری ہے۔ اگر تصویر اسکرین سے بڑی ہے تو واٹر مارک لگانے سے پہلے CGImageSourceCreateThumbnailAtIndex کا استعمال کرتے ہوئے اسے چھوٹا کریں۔ Core Graphics تمام کارروائیاں CPU پر سنبھالتا ہے — درجنوں تصاویر کی بیچ پروسیسنگ کے لیے، UI کو بلاک کرنے سے بچنے کے لیے بیک گراؤنڈ قطار اور CGBitmapContext استعمال کریں۔
اکثر پوچھے گئے سوالات
UIKit ایک اعلیٰ سطح کا UI فریم ورک ہے جو ڈرائنگ کے لیے اندرونی طور پر Core Graphics استعمال کرتا ہے۔ Core Graphics 2D گرافکس کے لیے نچلی سطح کی C API ہے۔ UIKit معیاری عناصر کے لیے زیادہ آسان ہے، جبکہ Core Graphics ہر پکسل پر مکمل کنٹرول دیتا ہے۔
Core Graphics جامد 2D گرافکس، چارٹ اور کسٹم UI عناصر کے لیے موزوں ہے۔ Metal 3D گرافکس، پیچیدہ اینیمیشنز اور GPU ایکسلریشن کے ساتھ بڑے پکسل اریوں کی پروسیسنگ کے لیے ہے۔ 95% UI کاموں کے لیے Core Graphics کافی ہے۔
مکمل لوڈنگ کے بجائے createThumbnailAtIndex کے ذریعے تھمب نیلز لوڈ کرنے کے لیے CGImageSource استعمال کریں۔ بڑی تصاویر دکھانے کے لیے، ڈاؤن سیمپل آپشن کے ساتھ CGImage بنائیں۔ جب مزید ضرورت نہ ہو تو CGImageRelease کے ذریعے CGImage کو جاری کریں۔
ہاں، Core Graphics میں پڑھنے کے لیے CGPDFDocument اور PDF دستاویزات بنانے کے لیے CGPDFContext کے ذریعے مکمل PDF سپورٹ شامل ہے۔ آپ ویکٹر کو محفوظ رکھتے ہوئے کسی بھی CGContext مواد کو براہ راست PDF صفحہ پر کھینچ سکتے ہیں۔
Core Graphics اسکرین پر ڈرائنگ کرتے وقت خود بخود ڈیوائس ریزولوشن استعمال کرتا ہے۔ آف لائن سیاق و سباق کے لیے، scale = 0 (سسٹم اسکیل) کے ساتھ UIGraphicsBeginImageContextWithOptions استعمال کریں یا Retina/Retina HD کے لیے واضح طور پر 2.0/3.0 بتائیں۔
خلاصہ
ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے
IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں