Το ερώτημα αυτό φαίνεται να έχουν τεθεί για να ξεκουραστούν, αλλά στην αναζήτησή μου για μια λύση που θα μπορούσε πιο εύκολα να καταλάβει (και γραμμένο σε Swift), έφτασα σε αυτό (δημοσιεύτηκε επίσης: Πώς να περικόψετε το UIImage )
Ήθελα να είναι σε θέση να περικόψετε από μια περιοχή βασίζονται σε αναλογία διαστάσεων, και την κλίμακα σε μέγεθος βασίζεται σε μια εξωτερική έκταση οριοθέτησης. Εδώ είναι παραλλαγή μου:
import AVFoundation
import ImageIO
class Image {
class func crop(image:UIImage, crop source:CGRect, aspect:CGSize, outputExtent:CGSize) -> UIImage {
let sourceRect = AVMakeRectWithAspectRatioInsideRect(aspect, source)
let targetRect = AVMakeRectWithAspectRatioInsideRect(aspect, CGRect(origin: CGPointZero, size: outputExtent))
let opaque = true, deviceScale:CGFloat = 0.0 // use scale of device's main screen
UIGraphicsBeginImageContextWithOptions(targetRect.size, opaque, deviceScale)
let scale = max(
targetRect.size.width / sourceRect.size.width,
targetRect.size.height / sourceRect.size.height)
let drawRect = CGRect(origin: -sourceRect.origin * scale, size: image.size * scale)
image.drawInRect(drawRect)
let scaledImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return scaledImage
}
}
Υπάρχουν μερικά πράγματα που βρήκα σύγχυση, οι ξεχωριστές ανησυχίες καλλιέργεια και αλλαγή μεγέθους. Περικοπή αντιμετωπίζεται με την προέλευση της ορθ που περνάτε να drawInRect, και την κλιμάκωση γίνεται από το τμήμα μέγεθος. Στην περίπτωσή μου, είχα ανάγκη να αφορούν το μέγεθος της περικοπής rect στην πηγή, με ορθ έξοδο μου από την ίδια αναλογία. Ο παράγοντας κλίμακας είναι τότε εξόδου / εισόδου, και αυτό πρέπει να εφαρμοστεί στο drawRect (πέρασε στην drawInRect).
Ένας περιορισμός είναι ότι η προσέγγιση αυτή προϋποθέτει ουσιαστικά ότι η εικόνα που σχεδιάζετε είναι μεγαλύτερο από το πλαίσιο της εικόνας. Δεν το έχω δοκιμάσει αυτό, αλλά νομίζω ότι μπορείτε να χρησιμοποιήσετε αυτόν τον κωδικό για να χειριστεί την περικοπή / ζουμ, αλλά ορίζοντας ρητά την παράμετρο κλίμακας για να είναι η παράμετρος πιο πάνω κλίμακα. Από προεπιλογή, UIKit εφαρμόζει έναν πολλαπλασιαστή με βάση την ανάλυση της οθόνης.
Τέλος, πρέπει να σημειωθεί ότι αυτή η προσέγγιση UIKit είναι υψηλότερο επίπεδο από ό, τι CoreGraphics / Quartz και Core προσεγγίσεις εικόνας, και φαίνεται να χειριστεί τα ζητήματα προσανατολισμό της εικόνας. Αξίζει επίσης να σημειωθεί ότι είναι αρκετά γρήγορο, δεύτερη σε ImageIO, σύμφωνα με αυτό το post εδώ: http://nshipster.com/image-resizing/