MILLEN BOX

音楽好きの元組み込みソフトエンジニアによるプログラミング(主にiOSアプリ開発)の勉強の記録

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)

参考ページは以下です。

cheesememo.blog39.fc2.com

 
1point当たり何pixelになるかは実行するiOSバイスによって異なります。
以下のコードで調べることが出来ます。
scaleが1point当たりのpixel数にあたります。

let scale = imageSize.height / viewSize.height

 
よって、

  • UIImageを基準に指定したRectのx,y,width,heightにそれぞれscaleをかけたRectを準備する
  • その算出されたRectを CGImageCreateWithImageInRect の引数に指定する

を行うことで、想定通りに動作されるようになります。