swift - while 循环缩小图像大小,无论运行多少次迭代都无法低于 400kB

标签 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
}

image data size is 6581432

image data size is 391167

image data size is 394974

image data size is 394915

image data size is 394845

知道我的问题是什么吗?

最佳答案

UIImageJPEGRepresentation 的质量参数不是图像大小的比例。相反,它指定 JPG 压缩可能是有损的。质量为零表示算法可以为您的数据生成的损失最大且尺寸最小的文件,但不能保证其大小一定。实际大小取决于图像的大小和复杂性(就颜色/空间频率而言),因为这就是压缩算法所丢弃的内容。如果您需要使图像在磁盘上具有一定的大小,我建议您将其采样到较低的分辨率,然后使用 0.4 到 0.6 之间的 JPG 质量设置。低值往往会产生一堆伪影,具体取决于您要压缩的图像类型。

编辑:向 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))
            }
        }
    }

关于swift - while 循环缩小图像大小,无论运行多少次迭代都无法低于 400kB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41341465/

相关文章:

ios - 尝试在主从 View 中获取并更新特定的核心数据实体

ios - UIPinchGestureRecognizer 在哪个线程上工作?

ios - 使用 SwiftGif 制作慢速 gif 动画

iphone - 如何只重复图像的一部分?

swift - if let 语句有什么意义?

ios - 有没有强制刷卡之类的东西?

objective-c - ios-在 uiimage 元数据中添加地理定位

ios - CGImageSourceCreateImageAtIndex 返回 nil

ios - 如何在 iOS 上为 kCGImagePropertyRawDictionary 设置元数据?

ios - 将图像保存到核心数据