クリスマスっぽいスクリーンキャプチャーにしてみる

※これはVOYAGE GROUP エンジニアブログ:Advent Calendar 2013の8日目です。

@TachibanaKaoruです。 今日はアドベントカレンダーの記事ということで、ちょっとクリスマスっぽいことをしてみますね。

スクリーンキャプチャーについて

iPhoneでは、ホームボタンと電源ボタンを同時に押すと、どんな画面でもスクリーンキャプチャーを撮ることができます。 ユーザーとしては、画面メモがいつでもとれて便利ですが、著作権のあるコンテンツを含むアプリのようなスクリーンキャプチャーをあまりとられたくないアプリなどではちょっと困ることもあるんですよね。

iOS7からは、ユーザーがスクリーンキャプチャーを撮ったときに、Notificationを受け取ることができるようになりました。 この新しいNotificationを使って、ユーザーがスクリーンキャプチャーを撮ったときに、自動的にその画像を加工するサンプルを作ってみました。

スクリーンキャプチャーの取得

まず、こちらのNotificationでスクリーンキャプチャーのNotificationを取得。

Screen Capture Notification

画像の取得と加工

画像は、AssetsLibraryを使って取得。 まずはカメラロールのALAssetsGroupをとってきます。

カメラロールの取得

そして、その中の最後のインデックス値でenumerateAssetsAtIndexesをコールしてALAssetファイルを取得します。 このALAssetが、最後のスクリーンキャプチャーの画像アセットになります。

gist7847347

ただし、ここでちょっと問題が発生。 UIApplicationUserDidTakeScreenshotNotificationのNotificaionが発生してからすぐ写真をAssetsLibraryからとってこようとすると、まだスクリーンキャプチャーの画像ファイルが保存されていないので、画像がとれないんですよね。 AssetsLibraryの数が増えるまで監視しようかと思ったけど、面倒だったので2秒ほどsleepしてちょっと待機。

あとは、取得したAssetを加工して、UIImageWriteToSavedPhotosAlbumでカメラロールに保存するだけです。

このサンプルを使うと

ユーザーが撮ったスクリーンキャプチャーに加えて、クリスマス模様のはいったスクリーンキャプチャーが保存されます。

screen1元のスクリーンキャプチャーはこんな感じですが……

screen2こんな感じにクリスマスっぽくなりました。

取得したAssetに重ねたのはこちらの画像です。

ちょっと残念だったのが、このNotificationは、自アプリ内でスクリーンキャプチャーを取得した場合にしかNotifyされないこと。 自分のアプリのなかでとったスクリーンキャプチャーを検知して加工することはできますが、他のアプリでとったスクリーンキャプチャーは検知できません。 すべてのスクリーンキャプチャーを加工するには、AssetLibraryを監視しておくしかなさそうです。

明日のAdvent Calendarはjewelさんです。