【问题标题】:How to convert pixel dimension to CG Size in Swift?如何在 Swift 中将像素尺寸转换为 CG 尺寸?
【发布时间】:2020-10-25 10:21:17
【问题描述】:

我有用户在 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?

【问题讨论】:

    标签: swift uikit swift5 cgsize


    【解决方案1】:

    让这个工作:

    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)
                }
            }
    }
    

    【讨论】:

    • @LeoDabus 乘以比例得到 400x400 的图像(当比例为 2.0 时)。幸运的是,我使用的图像是方形的。
    • @LeoDabus 我做了另一个改变,这对我来说似乎是准确的。想法?
    • @LeoDabus 该解决方案现在执行 .scaleAspectFit 并用白色填充空白空间。就我而言,我只使用正方形,所以没关系。
    • @LeoDabus 我正在真实设备上进行测试,并且按比例划分工作正常
    【解决方案2】:

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

    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)
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2023-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-05
      • 1970-01-01
      • 2012-04-10
      • 2016-04-14
      • 2012-06-16
      相关资源
      最近更新 更多