UIImagePickerControllerで撮影した写真と同じイメージのUIImageを取得する

| コメント(0) | トラックバック(0)
こんにちは。開発担当のICTFです。

iPhoneで撮影した画像をそのまま画面に貼付ける処理を実装していたのですが、少し困った事がおこりました。
まず前提として、どのサイズの画像でも画面内に表示できるよう同じ縮尺で拡大縮小する機能を盛り込んでいます。

もちろんiPhoneカメラで撮影した場合も上記の処理を通過する訳ですが、そもそも同じ画面サイズで撮っているのであれば何の影響も無いと考えていました。
iPadだと確かに問題なかったのですが、iPhoneの場合問題がありました。
実機を縦にして撮影しているのですが、得られる画像は横長なんです。
iPhoneの撮影画面で見えている画像の両脇部分まで実は写真になっていたのですね。
そしてこの横長画像を画面に貼付けた場合、画像の拡大縮小機能により画面の上下に空白が生まれ、且つそもそも撮影した時とは別のイメージ(両脇の見えてなかった部分です)になってしまいます。

どうやら実機を縦にしても横長画像として取得されるのは仕様のようで、イメージ通りの画像として扱う為には加工する必要がありました。
加工の手順としては、
1.縦の画面サイズに合わせた縮尺で画像を縮小する
2.横の画面サイズに合わせて画像を切り取る
となります。
ソースは以下の通りです。

// 画像選択画面で画像が選択された

-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info

{

CGSize winSize = [[CCDirector sharedDirector] winSize];


// 画像を取得する

UIImage* image = [info objectForKey:UIImagePickerControllerEditedImage];

if (!image) {

image = [info objectForKey:UIImagePickerControllerOriginalImage];

}


// 取得した画像サイズを画面内に収まる大きさに調整する

CGImageRef imageRef = [image CGImage];

size_t w = CGImageGetWidth(imageRef);

size_t h = CGImageGetHeight(imageRef);

size_t resizeW, resizeH;


// iPhoneの撮影はかならず横長になる為、縦長基準で縮小後に横を切り取る

resizeH = winSize.height;

resizeW = w * resizeH / h;

size_t cutW = winSize.width

UIGraphicsBeginImageContext(CGSizeMake(cutW, resizeH));

[image drawInRect:CGRectMake(0, 0, cutW, resizeH)];

image = UIGraphicsGetImageFromCurrentImageContext();

UIGraphicsEndImageContext();

}


後はUIImageであるimageをCCSpriteで読み込んで画面に貼付ければ、無事完了ですね。

トラックバック(0)

トラックバックURL: http://www.ict-fractal.com/MovableType/mt/mt-tb.cgi/10

コメントする

Twitterボタン
Twitterブログパーツ