العمل مع الصور: تغيير الحجم والقص في Swift (iOS/macOS)
\n\nمعالجة الصور هي إحدى المهام الأساسية عند تطوير التطبيقات لأنظمة iOS و macOS. سواء كان ذلك تحميل الصورة الرمزية للمستخدم، أو إعداد معاينات للصور، أو العمل مع المحتوى الرسومي، فستحتاج بالتأكيد إلى عمليات تغيير الحجم (resize) والقص (crop). في هذه المقالة، سنشرح كيفية تنفيذ هذه المهام في Swift باستخدام الأطر المدمجة UIKit (لـ iOS) و AppKit (لـ macOS)، بالإضافة إلى Core Graphics الشامل.
الطرق الأساسية
\n\nفي نظام Apple البيئي، توجد عدة طرق للتعامل مع الصور. سننظر في اثنتين من أكثر الطرق شيوعًا وكفاءة:
\n\n- \n
- UIKit / AppKit + Core Graphics — نهج منخفض المستوى ولكنه مرن جدًا. يسمح بالتحكم الدقيق في جودة وحجم النتيجة. \n
- Image I/O — إطار عمل للعمل مع البيانات الوصفية وترميز/فك ترميز الصور. مثالي للمهام التي تكون فيها الكفاءة مهمة عند العمل مع ملفات كبيرة. \n
في هذه المقالة، سنركز على الطريقة الأولى لأنها الأكثر شمولاً ولا تتطلب تبعيات إضافية.
\n\nتغيير حجم الصورة (Resize)
\n\nتأخذ دالة تغيير الحجم الصورة الأصلية والحجم المستهدف، وتعيد صورة جديدة بالمعايير المحددة. من المهم الحفاظ على نسب الأبعاد لتجنب التشويه.
\n\nمثال لـ iOS (UIKit)
\n\nimport UIKit\n\nextension UIImage {\n func resized(to targetSize: CGSize) -> UIImage? {\n // تحديد المقياس ليتناسب مع targetSize مع الحفاظ على النسب\n let widthRatio = targetSize.width / size.width\n let heightRatio = targetSize.height / size.height\n let scale = min(widthRatio, heightRatio)\n \n // الحجم الجديد مع الحفاظ على النسب\n let newSize = CGSize(width: size.width * scale, height: size.height * scale)\n \n // إنشاء سياق رسومي بالحجم الجديد\n UIGraphicsBeginImageContextWithOptions(newSize, false, 0.0)\n draw(in: CGRect(origin: .zero, size: newSize))\n let newImage = UIGraphicsGetImageFromCurrentImageContext()\n UIGraphicsEndImageContext()\n \n return newImage\n }\n}\n\n// الاستخدام:\nif let image = UIImage(named: "example"),\n let resized = image.resized(to: CGSize(width: 300, height: 200)) {\n // استخدام resized\n}\n\nمثال لـ macOS (AppKit)
\n\nimport AppKit\n\nextension NSImage {\n func resized(to targetSize: NSSize) -> NSImage? {\n let widthRatio = targetSize.width / size.width\n let heightRatio = targetSize.height / size.height\n let scale = min(widthRatio, heightRatio)\n \n let newSize = NSSize(width: size.width * scale, height: size.height * scale)\n let newImage = NSImage(size: newSize)\n \n newImage.lockFocus()\n draw(in: NSRect(origin: .zero, size: newSize),\n from: NSRect(origin: .zero, size: size),\n operation: .copy,\n fraction: 1.0)\n newImage.unlockFocus()\n \n return newImage\n }\n}\n\nهام: بالنسبة لـ macOS، الدالة\n\nUIGraphicsBeginImageContextWithOptionsغير متوفرة. يتم استخدامlockFocus()/unlockFocus()أو Core Graphics.
قص الصورة (Crop)
\n\nيسمح القص بتحديد منطقة مستطيلة من الصورة الأصلية. يُستخدم غالبًا لإنشاء صور رمزية مربعة أو إزالة الحواف الزائدة.
\n\nطريقة شاملة باستخدام Core Graphics
\n\nimport CoreGraphics\n\nextension UIImage {\n func cropped(to rect: CGRect) -> UIImage? {\n guard let cgImage = self.cgImage else { ret