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 অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন