Files
yattee/Yattee/Extensions/PlatformImage+Cropping.swift
2026-02-08 18:33:56 +01:00

62 lines
1.8 KiB
Swift

//
// PlatformImage+Cropping.swift
// Yattee
//
// Cross-platform image cropping for extracting thumbnails from sprite sheets.
//
import Foundation
import CoreGraphics
#if os(macOS)
import AppKit
extension NSImage {
/// Crops the image to the specified rect.
/// - Parameter rect: The rect to crop in image coordinates (origin at top-left)
/// - Returns: The cropped image, or nil if cropping fails
func cropped(to rect: CGRect) -> NSImage? {
// Get CGImage representation
guard let cgImage = self.cgImage(forProposedRect: nil, context: nil, hints: nil) else {
return nil
}
// NSImage coordinates have origin at bottom-left, but CGImage has origin at top-left
// The rect is already in top-left coordinate system, so use it directly
guard let croppedCGImage = cgImage.cropping(to: rect) else {
return nil
}
return NSImage(cgImage: croppedCGImage, size: rect.size)
}
}
#else
import UIKit
extension UIImage {
/// Crops the image to the specified rect.
/// - Parameter rect: The rect to crop in image coordinates (origin at top-left)
/// - Returns: The cropped image, or nil if cropping fails
func cropped(to rect: CGRect) -> UIImage? {
guard let cgImage = self.cgImage else { return nil }
// Scale rect for image scale (Retina displays)
let scale = self.scale
let scaledRect = CGRect(
x: rect.origin.x * scale,
y: rect.origin.y * scale,
width: rect.width * scale,
height: rect.height * scale
)
guard let croppedCGImage = cgImage.cropping(to: scaledRect) else {
return nil
}
return UIImage(cgImage: croppedCGImage, scale: scale, orientation: .up)
}
}
#endif