画像に何か加工を行った際に向きが勝手に変わってしまう

大雑把な括りになってしまうけれど、かなりハマってしまったので備忘録として残しておきたい。

タイトルの問題は画像に対してCoreImageを使い、エフェクトをかけたり、QuartzCoreを使って回転させたりした時に起こった。

テストで使っていた画像は

  1. iPhoneの壁紙用に作った960*640の画像
  2. iPhone(4S)のカメラで撮った3264*2448の画像

の2種類。1の場合はエフェクト、回転共に全く問題なく動作して安心していたのだが、2の画像でテストした時に思うように行かなくなった。

具体的には

  • CoreImageでエフェクトをかけた場合は90度回転した状態で画像が生成される
  • QuartzCoreで回転させた場合は縦長だった画像がそのまま横に伸ばされてしまったような状態の画像が生成される

とメチャクチャな結果になってしまった。

まず初めに疑ったのは画像のサイズ。大きなサイズを加工しようとしているのでメモリ不足を起こして妙な結果になっているのか?と思ったのだけど、どうもそうじゃないっぽい。

これに気がついたのはCoreImageのエフェクトをかける時にGPUで処理させず、CPUで処理させるようにして画像の大きさについてはクリアしてるであろう状態でも起こってしまったから。となるとCIImageとかで何かOrientationの指定をしないと勝手に向きが変わるのかなと予想して色々調べた。

 

結果、問題はCoreImageでもQuartzCoreでもなく画像そのもの、UIImage(のCGImage)にあった。

通常カメラで撮った写真の向きはUIImageのimageOrientationに保存されているのだけど、CGImageはそれを無視するらしく本問題が引き起こされる。

 

じゃあどうするかというとdrawInRectを使って一度画像を作り直す事で対処した。

drawInRectは写真の向き通りに画像を作ってくれるので

    UIGraphicsBeginImageContext(image.size);
    [image drawInRect:CGRectMake(0, 0, image.size.width, image.size.height)];
    image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

こんな感じで一度作りなおしてやる。これでこのimageはエフェクトをかけても勝手に回転しないし、回転処理を行なっても正しい結果が返ってくる様になった。

描画処理のどこかがまずいのかと散々頭を悩ませた結果、大本の画像に不備があったというオチでこの問題はかなりまいった