はじめに
- iPhoneで写真を撮ると無駄に画像サイズが大きいですよね。
- iOSアプリで画像を扱いたいときにうざかったりします。
- メモリを圧迫しますし、サーバーにアップロードする場合はサーバー代がかさみます。
- そこで、Swiftで画像ファイルサイズをなんとか下げたいと思ったのですが、ネット上にある方法だと画質がめちゃくちゃ悪くなってしまい困っていました。
- 色々試行錯誤して画質をできるだけ保ちつつ画像ファイルサイズを下げる方法を見つけたので共有します。
方法
ざっくり2つあります。
1 画像サイズをちっさくする
extension UIImage {
func resize(targetSize: CGSize) -> UIImage {
return UIGraphicsImageRenderer(size:targetSize).image { _ in
self.draw(in: CGRect(origin: .zero, size: targetSize))
}
}
}
このメソッドを使ってください(sizeの部分は好きな値をいれてください)
var resizedPicture: UIImage = picture.resize(targetSize: CGSize(width: picture.size.width / 8, height: picture.size.height / 8))
2 jpegに変換する際のクオリティ(compressionQuality)を下げる
resizedPicture = resizedPicture.jpegData(compressionQuality: 0.25)
compressionQualityは0.0から1.0まで指定できますが、結構下げても画質が悪くならない(その割にファイルサイズはだいぶ下がる)のでおすすめです。
結果
iPhoneで撮影した1.3MBの画像が57KBになりました。
ネットにある方法との比較
ネットにある方法( https://stackoverflow.com/questions/29137488/how-do-i-resize-the-uiimage-to-reduce-upload-image-size )で圧縮した画像
画質に大きな差があることがわかります。しかも、画像ファイルサイズも前者は後者の半分以下に抑えられています。
おわりに
- この方法を使えば画質を保ったまま画像ファイルサイズを下げることができます。
- ただ、なぜできるのか(正確にはネットでよくある方法ではなぜ画質がめちゃ悪くなるのか)、といった部分はよくわからないので今後調べてわかったら追記する予定です。