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

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

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

ابدأ الدورة

العمل مع الصور في 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 متجهًا للأسفل) قد يكون من الضروري تحويل الإحداثيات.



دالة قص عامة لنظامي iOS وmacOS

\

توصيات