0

我有用户在 Swift 中上传的大图像,我需要将它们全部调整为 100x100px 以创建缩略图以存储在我的服务器中。到目前为止,我发现这会在给定 CGSize 的情况下调整图像的大小:

func resizedImage(image: UIImage, size: CGSize) -> UIImage? {
    let renderer = UIGraphicsImageRenderer(size: size)
    return renderer.image { (context) in
        image.draw(in: CGRect(origin: .zero, size: size))
    }
}

知道我的目标尺寸严格为 100x100px,有什么方法可以创建 CGSize?

4

2 回答 2

0

得到这个工作:

extension UIImage {
    func resizedImage(pixelSize: (width: Int, height: Int)) -> UIImage? {
            var size = CGSize(width: CGFloat(pixelSize.width) / UIScreen.main.scale, height: CGFloat(pixelSize.height) / UIScreen.main.scale)

            let rect = AVMakeRect(aspectRatio: self.size, insideRect: CGRect(x:0, y:0, width: size.width, height: size.height))
    
            let renderer = UIGraphicsImageRenderer(size: size)
            return renderer.image { (context) in
                self.draw(in: rect)
            }
        }
}
于 2020-07-05T04:48:56.817 回答
0

您应该根据用户设备的比例初始化渲染,并将其宽度和高度相乘,而不是除以它:

extension UIImage {
    func aspectFitScaled(to size: CGSize) -> UIImage {
        let format = imageRendererFormat
        format.opaque = false
        format.scale = UIScreen.main.scale
        let isLandscape = self.size.width > self.size.height
        let ratio = isLandscape ? size.width / self.size.width : size.height / self.size.height
        let drawSize = self.size.scaled(by: ratio)
        let x = (size.width - drawSize.width) / 2
        let y = (size.height - drawSize.height) / 2
        let origin = CGPoint(x: x, y: y)
        return UIGraphicsImageRenderer(size: size, format: format).image { _ in
            draw(in: CGRect(origin: origin, size: drawSize))
        }
    }
}

用法:

class ViewController: UIViewController {
    // imageView frame is 200 x 200
    @IBOutlet weak var imageView: UIImageView!
    override func viewDidLoad() {
        super.viewDidLoad()

        // original image size is (719.0, 808.0)
        let image = UIImage(data: try! Data(contentsOf: URL(string: "https://i.stack.imgur.com/Xs4RX.jpg")!))!
        imageView.backgroundColor = .gray
        
        let ivImage = image.aspectFitScaled(to: imageView.frame.size)
        imageView.image = ivImage
        print("ivImage.size", ivImage.size)   // (200.0, 200.0)
        print("ivImage.scale", ivImage.scale) // screen scale 3.0 iPhone 8 Plus

        // lets check the real image dimension
        let data = ivImage.jpegData(compressionQuality: 1)!
        let savedSize = UIImage(data: data)!.size
        print("savedSize", savedSize) // savedSize (600.0, 600.0)
    }
}
于 2020-07-05T05:29:04.653 回答