العمل مع الصور في Swift: تغيير الحجم والقص (iOS/macOS)

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

العمل مع الصور: تغيير الحجم والقص في Swift (iOS/macOS)

\n\n

معالجة الصور هي إحدى المهام الأساسية عند تطوير التطبيقات لأنظمة iOS و macOS. سواء كان ذلك تحميل الصورة الرمزية للمستخدم، أو إعداد معاينات للصور، أو العمل مع المحتوى الرسومي، فستحتاج بالتأكيد إلى عمليات تغيير الحجم (resize) والقص (crop). في هذه المقالة، سنشرح كيفية تنفيذ هذه المهام في Swift باستخدام الأطر المدمجة UIKit (لـ iOS) و AppKit (لـ macOS)، بالإضافة إلى Core Graphics الشامل.

\n\n

الطرق الأساسية

\n\n

في نظام Apple البيئي، توجد عدة طرق للتعامل مع الصور. سننظر في اثنتين من أكثر الطرق شيوعًا وكفاءة:

\n\n
    \n
  • UIKit / AppKit + Core Graphics — نهج منخفض المستوى ولكنه مرن جدًا. يسمح بالتحكم الدقيق في جودة وحجم النتيجة.
  • \n
  • Image I/O — إطار عمل للعمل مع البيانات الوصفية وترميز/فك ترميز الصور. مثالي للمهام التي تكون فيها الكفاءة مهمة عند العمل مع ملفات كبيرة.
  • \n
\n\n

في هذه المقالة، سنركز على الطريقة الأولى لأنها الأكثر شمولاً ولا تتطلب تبعيات إضافية.

\n\n

تغيير حجم الصورة (Resize)

\n\n

تأخذ دالة تغيير الحجم الصورة الأصلية والحجم المستهدف، وتعيد صورة جديدة بالمعايير المحددة. من المهم الحفاظ على نسب الأبعاد لتجنب التشويه.

\n\n

مثال لـ iOS (UIKit)

\n\n
import 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\n
import 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، الدالة UIGraphicsBeginImageContextWithOptions غير متوفرة. يتم استخدام lockFocus()/unlockFocus() أو Core Graphics.
\n\n

قص الصورة (Crop)

\n\n

يسمح القص بتحديد منطقة مستطيلة من الصورة الأصلية. يُستخدم غالبًا لإنشاء صور رمزية مربعة أو إزالة الحواف الزائدة.

\n\n

طريقة شاملة باستخدام Core Graphics

\n\n
import CoreGraphics\n\nextension UIImage {\n    func cropped(to rect: CGRect) -> UIImage? {\n        guard let cgImage = self.cgImage else { ret                    

توصيات