なかまばんくアプリ開発中のぼくです。
20日の月曜中に申請を完了する予定でいたのですが、実機で最終チェックをしていて、
写真のアップロードのところで挙動がおかしいことがあって、結局、申請をだしたのは、21日の朝でした。
細かいものをいろいろ準備しないといけなかったんですよね。アイコンとか起動時のデフォルト画像とか申請時の画面のスクリーンショットとか。作ることにこだわりすぎてて、そんなもんちゃちゃっとやればすぐできるでしょ!っとタカをくくってました。
特にスクショは大変。iPhoneの3.5インチ画面と4インチ画面、それとiPadの画面を登録しないといけない。
結局、4インチ用に5枚作って、縦幅を無理矢理削って3.5インチ用にしちゃったし、iPadは1枚だけにしちゃったりして、なんとか申請完了しましたー

で、その日の夜に、タイトルにβっていれてたなー、そういうのってリジェクトされるかもしれないなーって思ったので、βを外して再申請。なので、最終的には、昨日の夜に申請完了でした

というわけで、今回、写真のアップロードでハマった件についてのお話します。
仕組みとしては、プロフ画像をiPhoneのアルバムから画像を選択して、サーバに送ると
プロフ画像に設定できるというもの。
そのままだと大きいので幅か高さが640pxになるように縮小してからjpegデータにして送信するようにしてる。
で、なにかハマったかというと、縦長でとった写真が90度回転して横長になってしまうという現象が発生してました。
どうも、縦長の写真は横長のデータに回転情報を加えて縦長に見せてるみたい。
UIImageのimageOrientationをダンプしたら3(UIImageOrientationRight)だったので。
そうだったとしても、アプリ内で動かしているうちは、この回転データを維持しながら処理できるのだけど、UIImageJPEGRepresentationでデータにしてサーバに送信したあとでPHPのGDで画像のそのあたりを解釈してくれないのか、JPEGにうまく回転情報が負荷されないのか、、、で、横向きになってしまってるようでした。
なので、アプリ側でorientationが3のときはくるっと回転させてから送るようにしたら
ちゃんとなったようです。
ソース的にはこんな感じですかね。なんかもっとスマートにできる気がするんだけど、、たぶん、かなりムダが多いと思う。
これをUIImageJPEGRepresentationのかわりに使ってデータを作成する感じです。
+ (NSData*)jpegImage:(UIImage *)img quality:(float)f{
if (img.imageOrientation == UIImageOrientationLeft || img.imageOrientation == UIImageOrientationRight ){
UIGraphicsBeginImageContext(SZ(CGImageGetWidth(img.CGImage),CGImageGetHeight(img.CGImage)));
CGContextRef g = UIGraphicsGetCurrentContext();
CGContextDrawImage(g, RT(0, 0, CGImageGetWidth(img.CGImage), CGImageGetHeight(img.CGImage)), img.CGImage);
UIImage* cimg = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
UIGraphicsBeginImageContext(SZ(CGImageGetHeight(img.CGImage),CGImageGetWidth(img.CGImage) ));
g = UIGraphicsGetCurrentContext();
if (img.imageOrientation == UIImageOrientationLeft){
CGContextRotateCTM(g, -M_PI/2);
CGContextTranslateCTM(g, -(int)CGImageGetWidth(img.CGImage), 0);
}
else{
CGContextRotateCTM(g, M_PI/2);
CGContextTranslateCTM(g, 0, -(int)CGImageGetHeight(img.CGImage));
}
CGContextDrawImage(g, RT(0, 0, CGImageGetWidth(img.CGImage),CGImageGetHeight(img.CGImage)), cimg.CGImage);
UIImage* nimg = UIGraphicsGetImageFromCurrentImageContext();
UIImage* nnimg = [UIImage imageWithCGImage:nimg.CGImage scale:img.scale orientation:UIImageOrientationUp];
return UIImageJPEGRepresentation(nnimg, f);
}
return UIImageJPEGRepresentation(img, f);
}
RTはCGRectMake、SZはCGSizeMakeのマクロです。
そんなこんなでとりあえず、いまはレビューを待ちつつ、ほかのこととか、今後のこととか考えたりです。
あ、ヘルプをWEBに飛ばすようにしたまま、その先を作らないといけないんだった。
忘れないようしないと、ヘルプないよんってレビューのひとに言われちゃう。。
ではでは。
いろいろがんばりました、自分
