ios - 在 swift 3 中上传到 Firebase 存储之前调整 UIImage 的大小

标签 ios swift firebase uiimage storage

我已经设置了我的应用程序,这样当我按下按钮“cambiaimmagineutente”时,会出现一个选择器 Controller ,我可以选择图像,然后使用“UIImagePickerControllerReferenceURL”上传到 FIRStorage。在上传图像以节省空间并将其放置在较小的 ImageView 中之前,我找不到调整图像大小的方法。 这是代码:

 @IBAction func cambiaImmagineUtente(_ sender: UIButton) {
        imagePicker.allowsEditing = false
        imagePicker.sourceType = .photoLibrary
        present(imagePicker, animated: true, completion:nil)
    }

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
    picker.dismiss(animated: true, completion:nil)


    // if it's a photo from the library, not an image from the camera
    if #available(iOS 8.0, *), let referenceUrl = info[UIImagePickerControllerReferenceURL] as? URL {
        let assets = PHAsset.fetchAssets(withALAssetURLs: [referenceUrl], options: nil)
        let asset = assets.firstObject
        asset?.requestContentEditingInput(with: nil, completionHandler: { (contentEditingInput, info) in
            let imageFile = contentEditingInput?.fullSizeImageURL
            let filePath = FIRAuth.auth()!.currentUser!.uid +
            "/\(Int(Date.timeIntervalSinceReferenceDate * 1000))/\(imageFile!.lastPathComponent)"
            // [START uploadimage]
            self.storageRef.child(filePath)
                .putFile(imageFile!, metadata: nil) { (metadata, error) in
                    if let error = error {
                        //an error occured
                        print("Error uploading: \(error)")
                        return
                    }
                    self.uploadSuccess(metadata!, storagePath: filePath)
            }
            // [END uploadimage]
        })
    } else {
        guard let image = info[UIImagePickerControllerOriginalImage] as? UIImage else { return }
        guard let imageData = UIImageJPEGRepresentation(image, 0.8) else { return }
        let imagePath = FIRAuth.auth()!.currentUser!.uid +
        "/\(Int(Date.timeIntervalSinceReferenceDate * 1000)).jpg"
        let metadata = FIRStorageMetadata()
        metadata.contentType = "image/jpeg"
        self.storageRef.child(imagePath)
            .put(imageData, metadata: metadata) { (metadata, error) in
                if let error = error {
                    //an error occured
                    print("Error uploading: \(error)")

                    return
                }
                self.uploadSuccess(metadata!, storagePath: imagePath)
        }
    }
}

func uploadSuccess(_ metadata: FIRStorageMetadata, storagePath: String) {
    print("Upload Succeeded!")
    //self.urlTextView.text = metadata.downloadURL()?.absoluteString
    UserDefaults.standard.set(storagePath, forKey: "storagePath")
    UserDefaults.standard.synchronize()
    //self.downloadPicButton.isEnabled = true
}

func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
    picker.dismiss(animated: true, completion:nil)
}

最佳答案

你可以使用这个:

 func resizeImage(image: UIImage, targetSize: CGSize) -> UIImage {
        let size = image.size

        let widthRatio  = targetSize.width  / image.size.width
        let heightRatio = targetSize.height / image.size.height

        var newSize: CGSize
        if(widthRatio > heightRatio) {
            newSize = CGSize(width: size.width * heightRatio, height: size.height * heightRatio)
        } else {
            newSize = CGSize(width: size.width * widthRatio,  height: size.height * widthRatio)
        }

        let rect = CGRect(x: 0, y: 0, width: newSize.width, height: newSize.height)

        UIGraphicsBeginImageContextWithOptions(newSize, false, 1.0)
        image.draw(in: rect)
        let newImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()

        return newImage!
    }

使用:

let resizedImage = resizeImage(image: selectedImage, targetSize: CGSize.init(width: 300, height: 300))

确保您还在存储规则中为最大值制定了写入规则!

关于ios - 在 swift 3 中上传到 Firebase 存储之前调整 UIImage 的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44078999/

相关文章:

ios - 无法从字典值转换为数组

ios - 更改了子字符串的颜色,但字体设置已重置

Swift - 开启元类型

node.js - 分页/无限滚动时 Firebase endAt() 与 orderByChild() 的时髦行为

ios - Firebase 推送通知不适用于 TestFlight/adHoc 版本

android - native Checkout Paypal 按钮未在 android 中为发布 apk 呈现

ios - 与当前时间的差异 - 使用 String 而不是 dateWithEra

ios - Swift - TestFlight 版本中的 Vidyo SDK 问题

ios - NavigationController 后退按钮直到加载 View 后才出现

android - 获取值(value) Firebase