2017年5月18日木曜日

画像のクロップ(切り抜き)

画像の一部をクロップする方法。(とりあえず矩形で)

たとえば1024*1024の画像があったとして、そのx:100, y:100, width:200, height:200 の部分をクロップしたい場合、
UIImageのcgImage.cropping(to:)でクロップしたい範囲を指定してやれば、クロップした画像がCGImageとして得られるので、それを再びUIImageに変換してやればいい。
か〜んた〜ん♪


func cropImage(image:UIImage, cropRect:CGRect) -> UIImage {
    let cropRef = image.cgImage!.cropping(to: cropRect) //クロップ
    //UIImageに戻す
    let cropImage = UIImage(cgImage: cropRef!, scale: image.scale, orientation: image.imageOrientation)
    
    return cropImage
}

クロップ範囲に画像より大きい範囲を指定した場合

クロップはおこなわれない。
余白がつくとかはないよ。

解像度の違いに注意

画像によって(たとえばスクリーンキャプチャしたもの)はiPadとiPhoneで解像度に違いがあるため、クロップ範囲をそれに合わせないといけない。

iPadの768*1024の画面をキャプチャしたものはそのまま768*1024の等倍サイズだが、iPhoneの場合、320*568の画面をキャプチャしたものは画像サイズこそ320*568だが、2倍の解像度になっているので、内部的には640*1136になっている。

その解像度の比率はUIImageのscaleプロパティで得られるので、クロップ範囲のwidthとheightにそれぞれかけてやればいい。
キャプチャした画像のscaleプロパティは、iPadは1.0、iPhoneなら2.0になってるはずだ。
キャプチャしたものじゃなくても当然解像度に違いがある画像ならこのプロパティを使って計算すればいいと思う。

let cropRect = CGRect(x: 0, y: 0, width: image.size.width * image.scale, height: image.size.height * image.scale)
image = self.cropImage(image: image, cropRect: cropRect)

0 件のコメント:

コメントを投稿