คำถามนี้ดูเหมือนว่าจะได้รับการพักผ่อน แต่ในการแสวงหาของฉันสำหรับวิธีการแก้ปัญหาที่ฉันสามารถเข้าใจได้ง่ายขึ้น (และเขียนใน 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 บนแหล่งที่มากับ rect output ของฉันในอัตราส่วนเดียวกัน สเกลแฟกเตอร์คือเอาต์พุต / อินพุตและสิ่งนี้จำเป็นต้องใช้กับ drawRect (ส่งผ่านไปยัง drawInRect)
ข้อแม้หนึ่งคือวิธีการนี้จะถือว่าภาพที่คุณวาดมีขนาดใหญ่กว่าบริบทของภาพอย่างมีประสิทธิภาพ ฉันยังไม่ได้ทดสอบสิ่งนี้ แต่ฉันคิดว่าคุณสามารถใช้รหัสนี้เพื่อจัดการการครอบตัด / ซูม แต่กำหนดพารามิเตอร์สเกลให้ชัดเจนเป็นพารามิเตอร์สเกลดังกล่าว ตามค่าเริ่มต้น UIKit จะใช้ตัวคูณตามความละเอียดหน้าจอ
ในที่สุดก็ควรจะสังเกตว่าวิธี UIKit นี้อยู่ในระดับที่สูงกว่าวิธีของ CoreGraphics / Quartz และ Core Image และดูเหมือนว่าจะจัดการกับปัญหาการวางแนวภาพ นอกจากนี้ยังเป็นมูลค่าการกล่าวขวัญว่ามันค่อนข้างเร็วรองจาก ImageIO ตามโพสต์นี้ที่นี่: http://nshipster.com/image-resizing/