আমি সুইফটে চিত্র স্কেলিংয়ের একটি চূড়ান্ত সমাধান বিকাশ করেছি।
আপনি চিত্রটি পূরণ করতে, দিক পূরণ করতে বা দিকের ফিট নির্দিষ্ট আকারের আকার পরিবর্তন করতে এটি ব্যবহার করতে পারেন।
আপনি চিত্রটি কেন্দ্র বা চারটি কিনার এবং চার কোণার যেকোন একটিতে সারিবদ্ধ করতে পারেন।
এবং আপনি অতিরিক্ত স্থানটি ছাঁটাই করতে পারেন যা যুক্ত হয় যদি মূল চিত্র এবং লক্ষ্য আকারের অনুপাতটি সমান না হয়।
enum UIImageAlignment {
case Center, Left, Top, Right, Bottom, TopLeft, BottomRight, BottomLeft, TopRight
}
enum UIImageScaleMode {
case Fill,
AspectFill,
AspectFit(UIImageAlignment)
}
extension UIImage {
func scaleImage(width width: CGFloat? = nil, height: CGFloat? = nil, scaleMode: UIImageScaleMode = .AspectFit(.Center), trim: Bool = false) -> UIImage {
let preWidthScale = width.map { $0 / size.width }
let preHeightScale = height.map { $0 / size.height }
var widthScale = preWidthScale ?? preHeightScale ?? 1
var heightScale = preHeightScale ?? widthScale
switch scaleMode {
case .AspectFit(_):
let scale = min(widthScale, heightScale)
widthScale = scale
heightScale = scale
case .AspectFill:
let scale = max(widthScale, heightScale)
widthScale = scale
heightScale = scale
default:
break
}
let newWidth = size.width * widthScale
let newHeight = size.height * heightScale
let canvasWidth = trim ? newWidth : (width ?? newWidth)
let canvasHeight = trim ? newHeight : (height ?? newHeight)
UIGraphicsBeginImageContextWithOptions(CGSizeMake(canvasWidth, canvasHeight), false, 0)
var originX: CGFloat = 0
var originY: CGFloat = 0
switch scaleMode {
case .AspectFit(let alignment):
switch alignment {
case .Center:
originX = (canvasWidth - newWidth) / 2
originY = (canvasHeight - newHeight) / 2
case .Top:
originX = (canvasWidth - newWidth) / 2
case .Left:
originY = (canvasHeight - newHeight) / 2
case .Bottom:
originX = (canvasWidth - newWidth) / 2
originY = canvasHeight - newHeight
case .Right:
originX = canvasWidth - newWidth
originY = (canvasHeight - newHeight) / 2
case .TopLeft:
break
case .TopRight:
originX = canvasWidth - newWidth
case .BottomLeft:
originY = canvasHeight - newHeight
case .BottomRight:
originX = canvasWidth - newWidth
originY = canvasHeight - newHeight
}
default:
break
}
self.drawInRect(CGRectMake(originX, originY, newWidth, newHeight))
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return image
}
}
নীচে এই সমাধানটি প্রয়োগ করার উদাহরণ রয়েছে।
ধূসর আয়তক্ষেত্রটি টার্গেট সাইটের চিত্রটিকে আবার আকার দেওয়া হবে। হালকা নীল আয়তক্ষেত্রের নীল চেনাশোনাগুলি হ'ল চিত্র (আমি চেনাশোনাগুলি ব্যবহার করেছি কারণ দিকটি সংরক্ষণ না করে কখন এটি ছোট করে দেওয়া হয় তা দেখতে সহজ)। হালকা কমলা রঙের এমন অঞ্চল চিহ্নিত করে যা আপনি পাস করলে ছাঁটা হবে trim: true
।
স্কেলিংয়ের আগে এবং পরে দিকটি ফিট করে :
দিক ফিট করার আরও একটি উদাহরণ :
শীর্ষ প্রান্তিককরণের সাথে দিকটি ফিট :
দিকটি পূরণ করুন :
পূরণ করুন :
আমি আমার উদাহরণগুলিতে আপসেলিং ব্যবহার করেছি কারণ এটি প্রদর্শন করা সহজ তবে সমাধানটি প্রশ্নে যেমন ডাউনস্কেলিংয়ের জন্যও কাজ করে।
জেপিজি সংক্ষেপণের জন্য আপনার এটি ব্যবহার করা উচিত:
let compressionQuality: CGFloat = 0.75 // adjust to change JPEG quality
if let data = UIImageJPEGRepresentation(image, compressionQuality) {
// ...
}
আপনি আমার কোডটি এক্সকোড খেলার মাঠের সাথে দেখতে পারেন ।