読者です 読者をやめる 読者になる 読者になる

Lynx-EyEDの電音鍵盤 新館

広帯域制御屋の駄文とか

1秒ごとにiPhoneカメラのライブプレビュをキャプチャしたいんだけど

iOS

iPod touchを買いました。touchは1世代目をとうの昔に売ってしまって、iPhone3GSを購入してからは必要なかったので。
GRIFFINのラバーケースもカッコいいので次いでに購入。*1
f:id:Lynx-EyED:20111010184146j:image

で、ちょっと必要に駆られてiOSを弄ってます。
解像度は必要ないんだけどカメラのプレビューを1秒間隔でキャプチャしたいというもの。

iOSデバイスで写真を取り込むにはUIImagePickerControllerの画像取得元であるsourceTypeをUIImagePickerControllerSourceTypeCameraにすれば良い訳です。
そのあと、画像編集設定とデリゲート設定を行い、イメージピッカーを表示するといった流れです。

UIImagePickerControllerSourceType sourceType;

sourceType = UIImagePickerControllerSourceTypeCamera;

if(![UIImagePickerController isSourceTypeAvailable:sourceType])
    {
        return;     // もしカメラデバイスが使えないならそのままリターン
    }
    
UIImagePickerController *picker = [[[UIImagePickerController alloc]init]autorelease];
picker.sourceType = sourceType;
picker.allowsEditing = YES;
picker.delegate = self;
    
[self presentModalViewController:picker animated:YES];


でもシャッターをいちいち切らなくてはいけません。
解決方法としてCameraControlを消して、iOSの低レベル層を掘って、シャッタトリガを自前実装するのも有りますが、メンドイ。

で、iOSデバイスのスクリーンショットを取得してくれるAPIを知りました。

UIGetScreenImage();  

このAPIはドキュメントに載っていません。で、これを使ったアプリはAppleからリジェクトされるとか、いや最近はされないとか、いろいろな情報が飛び交っていて本当のところ使っていいものか解りません。ま、実際リジェクトされるか試してみようと思います。
具体的にはこんな風に使います。

    CGImageRef imgRef = UIGetScreenImage();  
    
    //CGImageRefをUIImageに変換  
    UIImage *img = [UIImage imageWithCGImage:imgRef];  
    
    //イメージを解放  
    CGImageRelease(imgRef);  
    
    //「写真」に保存  
    UIImageWriteToSavedPhotosAlbum(img, nil, nil, nil);

なお、このコードを使う際、*.hファイルに以下を記述

CGImageRef UIGetScreenImage(void); 

上記のコードをpresentModalViewController:picker animated:メソッドを引き渡したあとから一定周期で呼び出せば言い訳です。
あまり早い周期だと、iOSがMemory warningを出すので、今回は1秒ごとにしました。
タイマーは

timer = [NSTimer scheduledTimerWithTimeInterval:(1) // 1秒毎に発生
target:self selector:@selector(onTimer:) 
userInfo:nil repeats:YES]; 
//タイマースタート 

//  --- (中略) --- 

- (void)onTimer:(NSTimer*)timer {

// 1秒ごとに呼び出されるのでここでUIGetScreenImageする

}

また*.hヘッダファイルに以下を追記

 -(void)onTimer:(NSTimer*)timer;

このタイマーを止めたい時はその箇所で

 [timer invalidate];

とすればOK。

◆参考文献(ブログ)

*1:これが後ほど照度センサーを隠してしまうシロモノである事に気が付くのであります