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

Swift 循环时图像缩小,can';无论运行多少次迭代,都不能低于400kB,swift,uiimage,Swift,Uiimage,图像数据大小为6581432 图像数据大小为391167 图像数据大小为394974 图像数据大小为394915 图像数据大小为394845 知道我的问题是什么吗?UIImageJPEGRepresentation的质量参数不是图像大小的比例。相反,它指定了JPG压缩可以是谁。Quality of zero表示算法可以为您的数据生成的最有损和最小大小的文件,但不能保证其大小一定。实际大小取决于图像的大小和复杂度,即颜色/空间频率,因为这是压缩算法要丢弃的。如果您需要在磁盘上使图像具有一定的大小,

图像数据大小为6581432

图像数据大小为391167

图像数据大小为394974

图像数据大小为394915

图像数据大小为394845


知道我的问题是什么吗?

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

编辑:将下采样扩展代码添加到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
}

谢谢@Josh Homann我如何“将采样降低到较低的分辨率”,而不是将JPEQ质量降低到60%以下,最好减小图像大小(即像素数)。为了显示,图像需要放大。顺便说一句:这或多或少是乔希·霍曼的建议。(下采样=减少像素数)
    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))
            }
        }
    }