UIImageとCGImageの違いでハマったこと [pixel] [point] [swift2.2]
以前、UIImageから一部を切り取る方法について本ブログにて書かせて頂きました。
anthrgrnwrld.hatenablog.com
ザクッと方法を説明しますと、targetとなるUIImageをCGImageへ変換し、そのCGImageと切り取るrectを指定し、 CGImageCreateWithImageInRect
を使用して切り取りを実行しています。
この度、UIImageを切り取りたい事案があり、ここで書いた方法で実行しましたが、想定した切り取り位置でimageが切り取られない現象が発生しました。
何で?と思いデバッグしてみたところ、「ん〜?どうやら指定した座標、長さの1/2で切り取られてるぞ〜?」ということに気づきました。実行環境はiPhone6です。ここでピンときました。
そこでググってみたところ、以下のようになっていることを理解しました。
- UIImageの長さや位置の指定はpoint単位で行う
- CGImageの長さや位置の指定はpixel単位で行う
- retinaディスプレイは1pointで複数pixelとなる(iPhone6の場合には2pixel)
参考ページは以下です。
1point当たり何pixelになるかは実行するiOSデバイスによって異なります。
以下のコードで調べることが出来ます。
scaleが1point当たりのpixel数にあたります。
let scale = imageSize.height / viewSize.height
よって、
- UIImageを基準に指定したRectのx,y,width,heightにそれぞれscaleをかけたRectを準備する
- その算出されたRectを
CGImageCreateWithImageInRect
の引数に指定する
を行うことで、想定通りに動作されるようになります。