Câu hỏi này dường như đã được đặt ra, nhưng trong quá trình tìm kiếm một giải pháp mà tôi có thể dễ hiểu hơn (và được viết bằng Swift), tôi đã đến đây (cũng được đăng lên: Làm thế nào để cắt UIImage? )
Tôi muốn có thể cắt từ một khu vực dựa trên tỷ lệ khung hình và tỷ lệ thành kích thước dựa trên phạm vi giới hạn bên ngoài. Đây là biến thể của tôi:
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
}
}
Có một vài điều mà tôi thấy khó hiểu, những mối quan tâm riêng biệt của việc cắt xén và thay đổi kích thước. Cắt xén được xử lý với nguồn gốc của trực tràng mà bạn chuyển đến drawInRect và tỷ lệ được xử lý bởi phần kích thước. Trong trường hợp của tôi, tôi cần liên quan đến kích thước của trực tiếp cắt xén trên nguồn, với chỉnh lưu đầu ra của tôi có cùng tỷ lệ khung hình. Hệ số tỷ lệ sau đó là đầu ra / đầu vào và điều này cần được áp dụng cho drawRect (được truyền cho drawInRect).
Một lưu ý là cách tiếp cận này giả định một cách hiệu quả rằng hình ảnh bạn đang vẽ lớn hơn bối cảnh hình ảnh. Tôi chưa thử nghiệm điều này, nhưng tôi nghĩ bạn có thể sử dụng mã này để xử lý cắt / thu phóng, nhưng xác định rõ ràng tham số tỷ lệ là tham số tỷ lệ đã nói ở trên. Theo mặc định, UIKit áp dụng hệ số nhân dựa trên độ phân giải màn hình.
Cuối cùng, cần lưu ý rằng phương pháp UIKit này ở cấp độ cao hơn so với phương pháp CoreGraphics / Quartz và Core Image, và dường như xử lý các vấn đề định hướng hình ảnh. Điều đáng nói là nó khá nhanh, đứng thứ hai sau ImageIO, theo bài đăng này tại đây: http://nshipster.com/image-resizing/