从UIImage生成固定尺寸的JPEG输出。

3

我目前使用以下代码从UIImage对象生成固定大小的JPEG图片:

var ratio: CGFloat = 1
var imageData : Data = UIImageJPEGRepresentation(edited, ratio)!

while imageData.count > 200000 {
    if ratio == 0.1 {
        break
    }

    ratio = ratio - 0.1
    imageData = UIImageJPEGRepresentation(edited, ratio)!
}

然而,这段代码似乎有点低效,因为我需要不断减小比例,直到图像大小低于指定值(200 kb)。在 Swift 中有更好的方法实现这种行为吗?


二分法 - 如果大小大于限制,请从0.5开始,使用0.25,如果较小,则使用0.75等等。 - Iłya Bursov
尝试使用固定大小的JPEG图像,点击此处 LINK 获得解决方案。您好! - pradip rathod
2个回答

1
使用此扩展程序以缩小图像。
extension UIImage {

    func resizeImage(factor: CGFloat) -> UIImage? {
        let newWidth = self.size.width * factor    // Calculate size from factor.
        let newHeight = self.size.height * factor

        let size = CGSize(width: newWidth, height: newHeight)
        return resizeImage(targetSize: size)       // Return image with scaled factor.
    }

    func resizeImage(targetSize: CGSize) -> UIImage? {
        let originalSize = self.size

        let widthRatio = targetSize.width / originalSize.width
        let heightRatio = targetSize.height / originalSize.height
        let ratio = min(widthRatio, heightRatio)

        let newSize = CGSize(width: originalSize.width * ratio, height: originalSize.height * ratio)
        let rect = CGRect(x: 0, y: 0, width: newSize.width, height: newSize.height)

        UIGraphicsBeginImageContextWithOptions(newSize, false, UIScreen.main.scale)
        self.draw(in: rect)

        let newImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()

        return newImage
    }

}

使用这个方法,我们可以使用你上面的代码来实现你想要做的事情。
var imageData: Data = UIImageJPEGRepresentation(edited, 1.0)

while imageData.count < 200000 {
     imageData = UIImageJPEGRepresentation(UIImage(data: imageData)!.resizeImage(factor: 0.9)!, 1.0)
     // imageData will be incremented down each time by a factor of 0.1 (1.0 - ratio)
}

编辑:如果您不想包含扩展名,您可以使用 imageData = UIImageJPEGRepresentation(imageData, 0.9),因为它仍然会每次缩小0.1倍。


0
你快完成了,你可以制作一个 扩展 来调整图片大小,以克为单位。
extension UIImage {
    func resizeImageByKByte(kb: Int) {
        let maxByte : Int64 = Int64(kb * 1024)
        var maxCompressQuality: CGFloat = 1
        var imageByte : Int64 = Int64(UIImageJPEGRepresentation(self, 1)?.count ?? 0)
        while imageByte > maxByte {
            imageByte = Int64(UIImageJPEGRepresentation(self, maxCompressQuality)?.count ?? 0)
            maxCompressQuality -= 0.1
        }
    }
}

使用方法:

 UIImage().resizeImageByKByte(kb: 200) // 200 KB

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接