ऐसा लगता है कि इस प्रश्न को आराम करने के लिए रखा गया है, लेकिन एक समाधान के लिए मेरी तलाश में जिसे मैं आसानी से समझ सकता हूं (और स्विफ्ट में लिखा गया है), मैं इस पर पहुंचा (यह भी पोस्ट किया गया: 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 पर पारित) पर लागू करने की आवश्यकता होती है।
एक चेतावनी यह है कि यह दृष्टिकोण प्रभावी रूप से मानता है कि आप जो चित्र बना रहे हैं वह छवि संदर्भ से बड़ा है। मैंने इसका परीक्षण नहीं किया है, लेकिन मुझे लगता है कि आप इस कोड का उपयोग क्रॉपिंग / जूमिंग को संभालने के लिए कर सकते हैं, लेकिन स्पष्ट रूप से स्केल पैरामीटर को पूर्वोक्त स्केल पैरामीटर के रूप में परिभाषित कर सकते हैं। डिफ़ॉल्ट रूप से, UIKit स्क्रीन रिज़ॉल्यूशन के आधार पर एक गुणक लागू करता है।
अंत में, यह ध्यान दिया जाना चाहिए कि यह UIKit दृष्टिकोण CoreGraphics / Quartz और Core Image दृष्टिकोण की तुलना में उच्च स्तर का है, और छवि अभिविन्यास समस्याओं को संभालने के लिए लगता है। यह भी ध्यान देने योग्य है कि यह इस पोस्ट के अनुसार ImageIO के लिए बहुत तेज़ है, यहाँ इस पोस्ट के अनुसार: http://nshipster.com/image-resizing/