mirror of
https://github.com/yattee/yattee.git
synced 2026-02-19 17:29:45 +00:00
62 lines
1.8 KiB
Swift
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
|