PUROGU LADESU

ポエムがメインのブログです。

【Swift】画像を選択してトリミングし圧縮する

画像の選択

標準のピッカーを使います。
allowsEditing = true で簡易的な編集画面が開き、正方形に切り出せます。

private func openAlbum() {
    let sourceType: UIImagePickerController.SourceType = .photoLibrary
    if UIImagePickerController.isSourceTypeAvailable(.photoLibrary) {
        let photoPicker = UIImagePickerController()
        photoPicker.sourceType = sourceType
        photoPicker.delegate = self
        photoPicker.allowsEditing = true // 選択後トリミング画面を開く
        self.present(photoPicker, animated: true, completion: nil)
    } else {
        print("アルバムが使えません")
    }
}

リサイズ

delegateメソッドのdidFinishPickingMediaWithInfoで選択データを取得します。
編集後のイメージはinfo[.editedImage] で取得できます。
SDWebImageのsd_resizedImage()でサイズを小さく指定します。

extension UserProfileViewController: UIImagePickerControllerDelegate {
    
    func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey: Any]) {

        // 編集後のイメージを取得する
        if let image = info[.editedImage] as? UIImage {
            // 256x256にリサイズしてメモリ上に保持
            newUserImage = image.sd_resizedImage(with: CGSize(width: 256, height: 256), scaleMode: .aspectFill)
            userImageView.image = image
            picker.dismiss(animated: true, completion: nil)
        }
        
        // 保存URLを取得する場合
        if let url = info[.imageURL] as? URL {
            print(url.absoluteURL)
            newUserImageUrl = url.absoluteString
            userImageView.sd_setImage(with: url)
            picker.dismiss(animated: true, completion: nil)
        }
        
        // オリジナルのイメージを取得する場合
        if let image = info[.originalImage] as? UIImage {
            newUserImage = image
            userImageView.image = image
            picker.dismiss(animated: true, completion: nil)
        }
    }
  
}

JPEG圧縮する

メモリ上にUIImageで保存しているものをjpegData()を使ってJPEG圧縮します。
その後dataを保存なりアップロードなりします。

var newUserImage: UIImage!
let data = newUserImage.jpegData(compressionQuality: 0.5)
uploadImage(data)