2013/07/16更新

[XCODE] Objective-Cでスクリーンショットを取得する方法

このエントリーをはてなブックマークに追加            

こんにちは、@yoheiMuneです。
「ロックボタン + ホームボタン」の同時押しで取得できるスクリーンショット。 それをObjective-Cのプログラムから取得する方法をブログに書きたいと思います。

画像



画面全体のスクリーンショットを撮る

取得可能なスクリーンショットは大きく2種類で、まずは1つ目を紹介します。
1つ目は、「ロックボタン + ホームボタン」の同時押しで取得できるスクリーンショットとほぼ同じ物を取得できる実装方法です。 以下のように実装します。
// 必要なライブラリを読み込みます
#import <CoreGraphics/CoreGraphics.h>
#import <QuartzCore/QuartzCore.h>

〜〜 省略 〜〜

// キャプチャ対象をWindowにします。
UIWindow *window = [[UIApplication sharedApplication] keyWindow];

// キャプチャ画像を描画する対象を生成します。
UIGraphicsBeginImageContextWithOptions(window.bounds.size, NO, 0.0f);
CGContextRef context = UIGraphicsGetCurrentContext();

// Windowの現在の表示内容を1つずつ描画して行きます。
for (UIWindow *aWindow in [[UIApplication sharedApplication] windows]) {
    [aWindow.layer renderInContext:context];
}

// 描画した内容をUIImageとして受け取ります。
UIImage *capturedImage = UIGraphicsGetImageFromCurrentImageContext();

// 描画を終了します。
UIGraphicsEndImageContext();
という感じです。ポイントは、以下の2点です。

  • CoreGraphicsの機能を使い、キャプチャ画像内容を描画して、生成します
  • renderInContext:メソッドを使い、Windowの内容をContextに複写します。

これで、以下のような画像が取得できます。
画像
取得してみると分かるのですが、ステータスバーのところが描画できていないのです。
Web上を色々と調べたのですが、ステータスバーも含めてスクリーンショットを撮る方法は見つけられませんでした。

ということで今回は、ステータスバーの画像は別に用意して、取得したスクリーンショットの画像と合成するように実装しました。
// 取得したスクリーンショット
UIImage *capturedImage = /*上記の実装で取得した画像*/

// ステータスバー部分が上記画像では取得できていないので、
// 別で用意したステータスバー画像を合成します。
UIGraphicsBeginImageContext(CGSizeMake(capturedImage.size.width, capturedImage.size.height));
[capturedImage drawAtPoint:CGPointMake(0, 0)];
[[UIImage imageNamed:@"status_bar"] drawAtPoint:CGPointMake(0, 0)];
capturedImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
これで、なんちゃってスクリーンショットの完成です。無事に以下のような画像を取得することが出来ました。
画像



対象のViewを指定してスクリーンショットを取得する

上記例では、Window全体を対象としたスクリーンショットの取得でしたが、スクリーンショットの対象を指定することも出来ます。
例えば以下のように、UIWebViewを対象にスクリーンショットを取得できます。
// webViewというUIWebView型のViewを、
// キャプチャ対象とします。
CGRect rect = webView.bounds;
UIGraphicsBeginImageContextWithOptions(rect.size, NO, 0.0f);
CGContextRef context = UIGraphicsGetCurrentContext();
[webView.layer renderInContext:context];
UIImage *capturedImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
UIWindowと同じく、「renderInContext:」というメソッドを使うことで、対象Viewの描画内容をContextに複写することが出来ます。
これで対象Viewのスクリーンショットの取得が完成です。



最後に

スクリーンショットの取得方法を色々と調べていたのですが、なんとか要件に合う実装方法が見つかってよかったなぁという思いです。 この機能を使ったiPhoneアプリも近々リリースできれば良いなぁと思う今日この頃です。

最後までご覧頂きましてありがとうございました。





こんな記事もいかがですか?

RSS画像

もしご興味をお持ち頂けましたら、ぜひRSSへの登録をお願い致します。