1. ホーム
  2. ios

[解決済み] PFFileとしてParseにアップロードする前に、画像のサイズを圧縮または縮小するにはどうすればよいですか?(Swift)

2022-12-24 08:59:38

質問

携帯電話で直接撮影した画像ファイルをParseにアップロードしようとしています。しかし、例外が発生します。

キャッチできない例外 'NSInvalidArgumentException', reason: 'PFFile cannot be larger than 10485760 bytes' のため、アプリを終了します。

以下は私のコードです。

最初のビューコントローラーで

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if (segue.identifier == "getImage")
    {
        var svc = segue.destinationViewController as! ClothesDetail
        svc.imagePassed = imageView.image
    }
}

画像をアップロードするビューコントローラに

let imageData = UIImagePNGRepresentation(imagePassed)
let imageFile = PFFile(name: "\(picName).png", data: imageData)

var userpic = PFObject(className:"UserPic")
userpic["picImage"] = imageFile`

しかし、まだその写真をParseにアップロードする必要があります。画像のサイズや解像度を小さくする方法はありますか?

どのように解決するのですか?

はい、あなたは UIImageJPEGRepresentation の代わりに UIImagePNGRepresentation を使うことで、画像ファイルサイズを小さくすることができます。以下のように、UIImageという拡張子を作ればいいのです。

Xcode 8.2 - Swift 3.0.2。

extension UIImage {
    enum JPEGQuality: CGFloat {
        case lowest  = 0
        case low     = 0.25
        case medium  = 0.5
        case high    = 0.75
        case highest = 1
    }

    /// Returns the data for the specified image in JPEG format.
    /// If the image object’s underlying image data has been purged, calling this function forces that data to be reloaded into memory.
    /// - returns: A data object containing the JPEG data, or nil if there was a problem generating the data. This function may return nil if the image has no data or if the underlying CGImageRef contains data in an unsupported bitmap format.
    func jpeg(_ quality: JPEGQuality) -> Data? {
        return UIImageJPEGRepresentation(self, quality.rawValue)
    }
}


を編集・更新しました。

Xcode 10 Swift 4.2

extension UIImage {
    enum JPEGQuality: CGFloat {
        case lowest  = 0
        case low     = 0.25
        case medium  = 0.5
        case high    = 0.75
        case highest = 1
    }

    /// Returns the data for the specified image in JPEG format.
    /// If the image object’s underlying image data has been purged, calling this function forces that data to be reloaded into memory.
    /// - returns: A data object containing the JPEG data, or nil if there was a problem generating the data. This function may return nil if the image has no data or if the underlying CGImageRef contains data in an unsupported bitmap format.
    func jpeg(_ jpegQuality: JPEGQuality) -> Data? {
        return jpegData(compressionQuality: jpegQuality.rawValue)
    }
}


使用方法

if let imageData = image.jpeg(.lowest) {
    print(imageData.count)
}