Swift压缩图片到指定大小以内,尺寸和体积双压缩

2023-04-24  本文已影响0人  Tlsion小富

在Swift中,可以使用Core Graphics和Image I/O框架来实现图片的压缩。以下是将图片压缩到指定大小以内的示例代码:

func compressImage(image: UIImage, maxSize: Int) -> Data? {

    var compression: CGFloat = 1.0    let maxCompression: CGFloat = 0.1    let targetSize = CGSize(width: 1024, height: 1024) //指定尺寸    let scale = UIScreen.main.scale //根据设备屏幕缩放比例调整尺寸   

    var imageData = image.jpegData(compressionQuality: compression)

    var imageSize = imageData?.count ?? 0    var sizeExceeded = imageSize > maxSize

    while sizeExceeded && compression > maxCompression {

        compression -= 0.1        imageData = image.jpegData(compressionQuality: compression)

        imageSize = imageData?.count ?? 0        sizeExceeded = imageSize > maxSize

    }

    if let imageSource = CGImageSourceCreateWithData(imageData as CFData, nil) {

        let options: [CFString: Any] = [

            kCGImageSourceThumbnailMaxPixelSize: max(targetSize.width, targetSize.height) * scale,

            kCGImageSourceCreateThumbnailFromImageAlways: true,

            kCGImageSourceCreateThumbnailWithTransform: true        ]

        if let scaledImage = CGImageSourceCreateThumbnailAtIndex(imageSource, 0, options as CFDictionary) {

            if let scaledImageData = UIImage(cgImage: scaledImage).jpegData(compressionQuality: compression) {

                imageData = scaledImageData

            }

        }

    }

    return imageData

}

该函数的参数image是要压缩的图片,maxSize是指定的最大尺寸,单位为字节。该函数会先尝试将图片质量压缩到指定大小以内,如果仍然超过指定大小,则会将图片尺寸缩小到指定大小以内。

在上面的代码中,首先定义了压缩质量的初始值compression为1.0,最小压缩质量maxCompression为0.1。然后通过循环将压缩质量逐渐降低,直到图片大小不超过指定大小或者压缩质量降到最小值为止。

接着使用Core Graphics框架中的CGImageSourceCreateWithData函数创建了一个图片源imageSource,然后通过指定缩略图的最大像素大小和其他选项,使用CGImageSourceCreateThumbnailAtIndex函数创建了一个缩略图。最后再将缩略图转换为JPEG格式的二进制数据返回即可。

需要注意的是,上述代码中指定了缩略图的尺寸为1024x1024,可以根据实际需求进行调整。同时,该函数返回的是JPEG格式的二进制数据,可以根据需要进行存储或展示。

上一篇 下一篇

猜你喜欢

热点阅读