[Swift3] UIImageから、アスペクト比を維持してサムネイルを生成する

前提

要素 バージョン
xcode 8.2.1
Swift 3.0.2
iPhone 6s
iOS 10.2.1

概要

既存のUIImageに対して、アスペクト比を維持したままサムネイル(縮小画像)を作成する関数を実装する。
本関数ではWidthを指定し、そのWidthとアスペクト比に合致したHeightを計算してリサイズする。
リサイズは非破壊的に行い、オリジナルのUIImageを維持したまま、リサイズ後のUIImageを新たに生成して返却する。

もっと良い方法がある気がするが、ググってもあまり見つからなかったので自前で実装

コード

/**
 * 横幅を指定してUIImageをリサイズする
 * @params image: 対象の画像
 * @params width: 基準となる横幅
 * @return 横幅をwidthに、縦幅はアスペクト比を保持したサイズにリサイズしたUIImage
*/
func resizeUIImageByWidth(image: UIImage, width: Double) -> UIImage {
  // オリジナル画像のサイズから、アスペクト比を計算
  let aspectRate = image.size.height / image.size.width
  // リサイズ後のWidthをアスペクト比を元に、リサイズ後のサイズを取得
  let resizedSize = CGSize(width: width, height: width * Double(aspectRate))
  // リサイズ後のUIImageを生成して返却
  UIGraphicsBeginImageContext(resizedSize)
  image.draw(in: CGRect(x: 0, y: 0, width: resizedSize.width, height: resizedSize.height))
  let resizedImage = UIGraphicsGetImageFromCurrentImageContext()
  UIGraphicsEndImageContext()
  return resizedImage!
}

備考

  • パラメータと計算式を微修正すれば、Heightをベースにリサイズする関数も作れる
  • 計算式をそれなりに弄れば、現在のサイズからn%リサイズといった関数も作れる
  • 指定したWidthがオリジナルより大きかったらオリジナルを戻すとか加えたほうが良さそう

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です