どうもです~。

なかまばんくアプリ開発中のぼくです。

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に飛ばすようにしたまま、その先を作らないといけないんだった。
忘れないようしないと、ヘルプないよんってレビューのひとに言われちゃう。。

ではでは。
いろいろがんばりました、自分