العمل مع الصور في Swift (iOS/macOS)
العمل مع الصور هي إحدى المهام الأساسية في تطوير تطبيقات الأجهزة المحمولة وسطح المكتب. في Swift لنظامي iOS وmacOS، توجد العديد من الأدوات المدمجة التي تسمح بتحميل الصور وعرضها ومعالجتها وحفظها. في هذه المقالة، سنستعرض بالتفصيل الأساليب الرئيسية وواجهات برمجة التطبيقات (API) التي ستساعدك على العمل بكفاءة مع الرسومات على منصات Apple.
الفئات الأساسية للعمل مع الصور
اعتمادًا على المنصة، تُستخدم فئات مختلفة:
- iOS/tvOS/watchOS —
UIImage(UIKit) - macOS —
NSImage(AppKit)
توفر كلتا الفئتين إمكانيات متشابهة، لكنهما تختلفان في واجهة برمجة التطبيقات (API). للتطوير عبر المنصات، يمكن استخدام بروتوكولات مشتركة أو إضافات.
تحميل الصور
أبسط طريقة هي تحميل صورة من موارد التطبيق:
// iOSlet image = UIImage(named: "example")
// macOSlet image = NSImage(named: "example")للتحميل من الشبكة، استخدم URLSession:
guard let url = URL(string: "https://example.com/image.jpg") else { return }
URLSession.shared.dataTask(with: url) { data, response, error in guard let data = data, error == nil else { return } DispatchQueue.main.async { // iOS let image = UIImage(data: data) // macOS let image = NSImage(data: data) }}.resume()عرض الصور
لعرض الصور على الشاشة، تُستخدم مكونات العرض (view) المناسبة:
- iOS —
UIImageView - macOS —
NSImageView
// iOSlet imageView = UIImageView(image: UIImage(named: "photo"))imageView.contentMode = .scaleAspectFit
// macOSlet imageView = NSImageView(image: NSImage(named: "photo"))imageView.imageScaling = .scaleProportionallyUpOrDownمعالجة الصور باستخدام Core Image
Core Image هو إطار عمل قوي لتصفية ومعالجة الصور. لنلقِ نظرة على مثال أساسي لتطبيق مرشح:
import CoreImage
func applyFilter(to inputImage: CIImage) -> CIImage? { guard let filter = CIFilter(name: "CISepiaTone") else { return nil } filter.setValue(inputImage, forKey: kCIInputImageKey) filter.setValue(0.8, forKey: kCIInputIntensityKey) return filter.outputImage}
// الاستخدامlet originalImage = CIImage(image: UIImage(named: "photo")!)!if let filteredImage = applyFilter(to: originalImage) { let context = CIContext() let cgImage = context.createCGImage(filteredImage, from: filteredImage.extent) let resultImage = UIImage(cgImage: cgImage!)}مرشحات Core Image الشائعة:
CISepiaTone— تأثير السيبياCIGaussianBlur— التمويه الغاوسيCIColorControls— ضبط السطوع والتباين والتشبعCIVignette— تأثير التظليل
العمل مع البكسلات وCGImage
للعمل على مستوى منخفض مع بيانات البكسلات، استخدم CGImage من Core Graphics:
func pixelColors(from image: UIImage) -> [[UIColor]]? { guard let cgImage = image.cgImage else { return nil } let width = cgImage.width let height = cgImage.height let colorSpace = CGColorSpaceCreateDeviceRGB() let bytesPerPixel = 4 let bytesPerRow = bytesPerPixel * width let bitsPerComponent = 8 var pixelData = [UInt8](repeating: 0, count: width * height * bytesPerPixel) guard let context = CGContext(data: &pixelData, width: width, height: height, bitsPerComponent: bitsPerComponent,