循环时缩小图像,无论运行多少次迭代,都不能低于400kB

时间:2016-12-27 08:17:50

标签: swift uiimage

func downsizeImage(image: UIImage) -> Data{
    var imagePointer = image
    let targetDataSize: CGFloat = 256.0 * 256
    var imageData = UIImageJPEGRepresentation(image, CGFloat(1.0))!
    while (CGFloat(imageData.count) > targetDataSize){
        var newProportion = targetDataSize / CGFloat(imageData.count)
        print("image data size is \(imageData.count)\n")
        imageData = UIImageJPEGRepresentation(imagePointer, CGFloat(newProportion))!
        imagePointer = UIImage(data: imageData)!
    }
    return imageData
}
  

图像数据大小为6581432

     

图像数据大小为391167

     

图像数据大小为394974

     

图像数据大小为394915

     

图像数据大小为394845

有什么问题我的问题是什么?

1 个答案:

答案 0 :(得分:0)

UIImageJPEGRepresentation的质量参数不是图像大小的一部分。相反,它指定了JPG压缩的有效性。零质量表示算法可以为您的数据生成的最小和最小大小的文件,但它无法保证其将达到一定的大小。实际大小取决于图像的大小和复杂性,在颜色/空间频率方面,因为压缩算法正在丢弃。如果您需要在磁盘上使图像具有一定的大小,我建议您将其采样到较低的分辨率,然后使用介于0.4和0.6之间的JPG质量设置。 Lowe值往往会产生一堆伪影,具体取决于您正在压缩的图像类型。

编辑:为UIImage添加下采样扩展代码:

    extension UIImage {
        func resize(to proportion: CGFloat) -> UIImage {
            let newSize = CGSize(width: size.width * proportion, height: size.height * proportion)
            return  UIGraphicsImageRenderer(size: newSize).image { context in
                self.draw(in: CGRect(origin: .zero, size: newSize))
            }
        }
    }