如何使用 SDWebImage 调整 UIImage 的大小?
how to resize UIImage with SDWebImage?
我想用 SDWebImage
调整图像大小。
我尝试使用 SDWebImageManagerDelegate
的 imageManager delegate
方法。
但是,我不知道如何调用 imageManager 方法。
我的代码在下面。
import UIKit
import SDWebImage
class testGraphic2ViewController: UIViewController, SDWebImageManagerDelegate {
@IBOutlet weak var imageView: UIImageView!
let postImageUrlStr = "https://firebasestorage.googleapis.com/v0/b/instagramclone-be6eb.appspot.com/o/posts%2FFBAE2BE9-F429-4D39-978C-DD2E24BF062D?alt=media&token=7b41569b-5451-4728-942c-6d43ec50350c"
override func viewDidLoad() {
super.viewDidLoad()
SDWebImageManager.shared().delegate = self
SDWebImageManager.shared().loadImage(with: URL(string: postImageUrlStr), options: [], progress: nil) { (image, data, error, cacheType, finished, url) in
self.imageView.image = image
}
}
func imageManager(_ imageManager: SDWebImageManager, transformDownloadedImage image: UIImage?, with imageURL: URL?) -> UIImage? {
print("imageManager is called!")
guard let image = image, let imageURL = imageURL else {
return nil
}
if (imageURL.lastPathComponent == "large" && (image.size.width > 1000 || image.size.width > 1000)) {
let targetSize = CGSize(width: 1000, height: 1000)
UIGraphicsBeginImageContextWithOptions(targetSize, false, image.scale)
image.draw(in: CGRect(origin: .zero, size: targetSize))
let scaledImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return scaledImage
} else {
return image
}
}
如何调用 imageManager 方法?
由于 SDWebImage 下载后会 return 一个 UIImage,因此我们可以创建 UIImage 的扩展并使用该扩展来调整图像的大小。
Swift3
extension UIImage{
func resizeImageWith(newSize: CGSize) -> UIImage {
let horizontalRatio = newSize.width / size.width
let verticalRatio = newSize.height / size.height
let ratio = max(horizontalRatio, verticalRatio)
let newSize = CGSize(width: size.width * ratio, height: size.height * ratio)
UIGraphicsBeginImageContextWithOptions(newSize, true, 0)
draw(in: CGRect(origin: CGPoint(x: 0, y: 0), size: newSize))
let newImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return newImage!
}
}
在SDWebImage 5.x, you can use in build SDImageResizingTransformer
中非常简单
let transformer = SDImageResizingTransformer(size: CGSize(300, 300), scaleMode: .fill)
let imageView: UIImageView
imageView.sd_setImage(withURL: url, placeholderImage: nil, context: [.imageTransformer: transformer])
我想用 SDWebImage
调整图像大小。
我尝试使用 SDWebImageManagerDelegate
的 imageManager delegate
方法。
但是,我不知道如何调用 imageManager 方法。
我的代码在下面。
import UIKit
import SDWebImage
class testGraphic2ViewController: UIViewController, SDWebImageManagerDelegate {
@IBOutlet weak var imageView: UIImageView!
let postImageUrlStr = "https://firebasestorage.googleapis.com/v0/b/instagramclone-be6eb.appspot.com/o/posts%2FFBAE2BE9-F429-4D39-978C-DD2E24BF062D?alt=media&token=7b41569b-5451-4728-942c-6d43ec50350c"
override func viewDidLoad() {
super.viewDidLoad()
SDWebImageManager.shared().delegate = self
SDWebImageManager.shared().loadImage(with: URL(string: postImageUrlStr), options: [], progress: nil) { (image, data, error, cacheType, finished, url) in
self.imageView.image = image
}
}
func imageManager(_ imageManager: SDWebImageManager, transformDownloadedImage image: UIImage?, with imageURL: URL?) -> UIImage? {
print("imageManager is called!")
guard let image = image, let imageURL = imageURL else {
return nil
}
if (imageURL.lastPathComponent == "large" && (image.size.width > 1000 || image.size.width > 1000)) {
let targetSize = CGSize(width: 1000, height: 1000)
UIGraphicsBeginImageContextWithOptions(targetSize, false, image.scale)
image.draw(in: CGRect(origin: .zero, size: targetSize))
let scaledImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return scaledImage
} else {
return image
}
}
如何调用 imageManager 方法?
由于 SDWebImage 下载后会 return 一个 UIImage,因此我们可以创建 UIImage 的扩展并使用该扩展来调整图像的大小。
Swift3
extension UIImage{
func resizeImageWith(newSize: CGSize) -> UIImage {
let horizontalRatio = newSize.width / size.width
let verticalRatio = newSize.height / size.height
let ratio = max(horizontalRatio, verticalRatio)
let newSize = CGSize(width: size.width * ratio, height: size.height * ratio)
UIGraphicsBeginImageContextWithOptions(newSize, true, 0)
draw(in: CGRect(origin: CGPoint(x: 0, y: 0), size: newSize))
let newImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return newImage!
}
}
在SDWebImage 5.x, you can use in build SDImageResizingTransformer
中非常简单let transformer = SDImageResizingTransformer(size: CGSize(300, 300), scaleMode: .fill)
let imageView: UIImageView
imageView.sd_setImage(withURL: url, placeholderImage: nil, context: [.imageTransformer: transformer])