【Swift】画像を圧縮して容量を減らす

どうも、ねこきち(@nekokichi1_yos2)です。

 

Realmに画像を保存しようとした時、データ容量が大きすぎる、とのエラーに遭遇しました。

stackoverflow.com

 

そこで、画像を圧縮すると、無事にRealmへ保存できました。

 

今回は、備忘録として画像の圧縮方法、を書きます。

 

結果

 

下記のコードで、画像を圧縮する前と10%に圧縮した後のデータサイズを確認すると、 10分の1以下に圧縮されてます。

 

let pickerImageData:Int = NSData(data: pickerImage.jpegData(compressionQuality: 1)!).count
let resizedImageData:Int = NSData(data: resizedImage.jpegData(compressionQuality: 1)!).count

print(Double(pickerImageData) / 1000.0)
print(Double(resizedImageData) / 1000.0)

 

f:id:nekokichi_yos2:20200901205926p:plain

 

ソースコード

 

import UIKit

class ViewController: UIViewController {
    
    @IBOutlet weak var imageView: UIImageView!
    
    let imagePicker = UIImagePickerController()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        imagePicker.delegate   = self
        imagePicker.sourceType = .photoLibrary
    }

    @IBAction func button(_ sender: Any) {
        present(imagePicker, animated: true, completion: nil)
    }
    
}

extension ViewController: UIImagePickerControllerDelegate, UINavigationControllerDelegate {

    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
        if let pickerImage = info[.originalImage] as? UIImage {
            // 10%に圧縮した画像
            let resizedImage          = pickerImage.resizeImage(withPercentage: 0.1)!
            // imageViewに挿入
            imageView.image = resizedImage
        }
        dismiss(animated: true, completion: nil)
    }

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

}

extension UIImage {
    // percentage:圧縮率
    func resizeImage(withPercentage percentage: CGFloat) -> UIImage? {
        // 圧縮後のサイズ情報
        let canvas = CGSize(width: size.width * percentage, height: size.height * percentage)
        // 圧縮画像を返す
        return UIGraphicsImageRenderer(size: canvas, format: imageRendererFormat).image {
            _ in draw(in: CGRect(origin: .zero, size: canvas))
        }
    }
}

 

参考

 

qiita.com

www.it-swarm.dev

qiita.com