1

我有一个带有“Snapchat 风格的相机”的应用程序(即你拍照,然后叠加文字和表情符号)。我目前正在将分辨率降低到 1080 x 2040,然后转换为质量为 0.75 的 jpegRepresentation。

这仍然给我一个> 2mb的文件大小,看起来很高。关于如何在不放弃太多质量的情况下降低文件大小的任何建议?我仍然希望图片在全屏尺寸下看起来不错。

调整图像大小,然后发送到存储

override func post() {
    // convert overlayed text and emojis to image and resize to 1080 x 2040
    guard let image = mediaView.asImage().resized(to: IMAGE_SIZE) else { return }

    //generate unique name for each image
    let imageId = NSUUID().uuidString
    let storageRef = Storage.storage().reference().child("post_images/\(imageId).jpeg")

    storageManager.upload(image: image, to: storageRef) { (err) in
        if let err = err {
            // TODO: Handle Error
            print("Error uploading image: \(err.localizedDescription)")
        } else {
            storageRef.downloadURL { (url, err) in
                guard let url = url else {
                    // TODO: Handle Error
                    print("Error getting image url: \(err?.localizedDescription)")
                    return
                }

                print("SUCCESSFULLY SAVED IMAGE")
            }
        }
    }
}

存储管理器:将图像转换为 jpeg 并进行压缩。然后上传

func upload(image: UIImage, to storageRef: StorageReference, then handler: @escaping UploadHandler) {
    // upload to storage
    if let uploadData = image.jpegData(compressionQuality: 0.75) {
        let metadata = StorageMetadata()
        metadata.contentType = ContentTypeEnum.jpegImage.rawValue // "image/jpeg"

        storageRef.putData(uploadData, metadata: metadata) { (metadata, err) in
            if let err = err {
                handler(err)
            } else {
                handler(nil)
            }
        }
    }
}

将 UIView 转换为 Image 的扩展

extension UIView {
    func asImage() -> UIImage {
        let renderer = UIGraphicsImageRenderer(bounds: bounds)
        return renderer.image { rendererContext in
            layer.render(in: rendererContext.cgContext)
        }
    }
}

调整 UIImage 大小的扩展

extension UIImage {
    func resized(to size: CGSize) -> UIImage? {
        let canvasSize = CGSize(width: size.width, height: size.height)
        UIGraphicsBeginImageContextWithOptions(canvasSize, false, scale)
        defer { UIGraphicsEndImageContext() }
        draw(in: CGRect(origin: .zero, size: canvasSize))
        return UIGraphicsGetImageFromCurrentImageContext()
    }
}
4

0 回答 0