RSS

iPhone:アプリ内でViewのスクリーンショットを取る

OS 3.1のcameraOverlayViewで大学時代に研究した時系列処理を実装してやんよっと意気揚々に始めたけど,カメラからの画像列はシャッターボタンを押すか,takePictureでシャッターボタンを呼び出さない限り取得できないということ.逐次,カシャカシャッと音を鳴らす訳にもいかず,挫折.動画撮影も同じでリアルタイムは無理だって.3.1ならできると思っていたのにー,わーわー.

半日を潰してしまったけど,調べてる最中に,アプリ内でUIViewのスクリーンショットを取るという他に転用できようなtipsを発見した.そのメモを以下に,ちなみにこのコードを一部書き換えてカメラのUIImagePickerControllerに対して行うと,真っ黒な画像が保存されるという,親切機能がOSに実装されている.意味わかんねーー
CGRect screenRef = [[UIScreen mainScreen] bounds];
UIGraphicsBeginImageContext(screenRef.size);

CGContextRef ctx = UIGraphicsGetCurrentContext();
[[UIColor blueColor] set];
CGContextFillRect(ctx, screenRef);

[self.view.layer renderInContext:ctx];

UIImage *screenImage = UIGraphicsGetImageFromCurrentImageContext();
UIImageWriteToSavedPhotosAlbum(screenImage, nil, nil, nil);

UIGraphicsEndImageContext();
昔,UIGetScreenImage()なるメソッドで簡単に取得できたみたいだけど,今はこれはなぜかオミットされています.The 大人の事情.

続きのエントリです.

Bookmark and Share

3 コメント:

匿名 さんのコメント...

過去記事へのコメントですみません。
スクリーンショットをアプリに組み込もうと思ってサンプルを使用させていただいたのですが、なぜかうまくいきません。
ツールバーを作って、そこにセーブボタンを付けスクリーンショットを撮ると、ツールバーのみがキャプチャされてしまいます。
なにか対処法はないのでしょうか?

mitsuharu さんのコメント...

self.view.layerがツールバーを指定しているのではないでしょか?

匿名 さんのコメント...

そうなんですね。
うすうす気付いてはいたのですが、どう指定すれば別のviewとなるのわかりませんでしたので…。

もしよろしければ、ツールバー以外(というよりも、私の場合はボタンをつけたviewの下に表示されているviewですね)を指定するための参考となるページやヒントなどをいただけないでしょうか?

何度もお手数をおかけしてしまいますが、よろしくお願いいます。