العمل مع الصور في Swift: تغيير الحجم والقص لنظامي iOS وmacOS
معالجة الصور هي واحدة من أكثر المهام شيوعًا عند تطوير تطبيقات الأجهزة المحمولة وسطح المكتب. على منصات Apple (iOS وmacOS) لتغيير حجم (resize) وقص (crop) الصور، يمكن استخدام كل من الأطر المدمجة (UIKit لنظام iOS، AppKit لنظام macOS) بالإضافة إلى الإطار القوي منخفض المستوى Core Graphics. في هذه المقالة، سنستعرض الطرق العامة التي تعمل على كلا المنصتين، وسنقدم أمثلة كود جاهزة بلغة Swift.
الطرق الأساسية لمعالجة الصور
هناك ثلاث طرق رئيسية لتغيير حجم أو قص صورة في Swift:
- UIKit (iOS/tvOS) — يستخدم الفئة
UIImageوطرقهاdraw(in:)أوUIGraphicsImageRenderer. - AppKit (macOS) — يستخدم الفئة
NSImageوالعمل معNSGraphicsContext. - Core Graphics (Quartz 2D) — إطار عمل C منخفض المستوى متعدد المنصات يعمل على كل من iOS وmacOS. يعتمد على
CGImageوسياقات الرسم.
لتحقيق العمومية، سنستخدم Core Graphics لأنه يسمح بكتابة كود يمكن تكييفه بسهولة مع كلا المنصتين. ومع ذلك، لمشاريع iOS غالبًا ما يكون استخدام UIGraphicsImageRenderer أكثر ملاءمة - فهو أبسط وأسرع.
تغيير حجم الصورة (Resize)
تستقبل دالة تغيير الحجم الصورة الأصلية (UIImage أو NSImage) والحجم الجديد (CGSize). الخوارزمية بسيطة: يتم إنشاء سياق رسم بالحجم المطلوب، ويتم رسم الصورة الأصلية فيه، ثم يتم استخراج الصورة الجديدة من السياق.
مثال لنظام iOS (UIKit)
import UIKit
extension UIImage { func resized(to newSize: CGSize) -> UIImage? { let renderer = UIGraphicsImageRenderer(size: newSize) return renderer.image { _ in self.draw(in: CGRect(origin: .zero, size: newSize)) } }}
// الاستخدام:if let image = UIImage(named: "example"), let resized = image.resized(to: CGSize(width: 300, height: 200)) { // استخدم resized}مثال لنظام macOS (AppKit + Core Graphics)
import AppKit
extension NSImage { func resized(to newSize: NSSize) -> NSImage? { guard let cgImage = self.cgImage(forProposedRect: nil, context: nil, hints: nil) else { return nil } let bitmap = NSBitmapImageRep( bitmapDataPlanes: nil, pixelsWide: Int(newSize.width), pixelsHigh: Int(newSize.height), bitsPerSample: 8, samplesPerPixel: 4, hasAlpha: true, isPlanar: false, colorSpaceName: .deviceRGB, bitmapFormat: .alphaFirst, bytesPerRow: 0, bitsPerPixel: 0 ) guard let context = NSGraphicsContext(bitmapImageRep: bitmap!) else { return nil } NSGraphicsContext.saveGraphicsState() NSGraphicsContext.current = context let rect = NSRect(origin: .zero, size: newSize) self.draw(in: rect, from: .zero, operation: .copy, fraction: 1.0) NSGraphicsContext.restoreGraphicsState() let newImage = NSImage(size: newSize) newImage.addRepresentation(bitmap!) return newImage }}قص الصورة (Crop)
القص (crop) هو تحديد منطقة مستطيلة من الصورة الأصلية. في Core Graphics، يتم استخدام الدالة cropping(to:) من CGImage. من المهم تذكر أن الإحداثيات في Core Graphics تبدأ من الزاوية السفلية اليسرى، لذلك بالنسبة لنظام iOS (حيث يكون المحور Y متجهًا للأسفل) قد يكون من الضروري تحويل الإحداثيات.