ページ

2008年3月20日木曜日

画面キャプチャその14 - 複数のウィンドウをキャプチャ(3)

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

キャプチャウィンドウに影を付けてみた。



ソース:FullScreenSample-14.zip


ウィンドウが一つの場合は、CGWindowListCreateImage() でkCGWindowImageDefault オプションを使えば標準で影が付いてくるので簡単にできる。


この場合、第一引数のCGRectには、CGRectNullを渡してやる。


一方、複数ウィンドウの場合は最後に画像を合成する必要がある為、影で増えた分のサイズを計算する必要がある。前回まではこれを考慮していなかったので影が付いていなかった。



これは第一引数にウィンドウの実際の大きさを指定していた為、周りの影の部分が無視されていた。第一引数にウィンドウの実サイズではなく、CGRectNullを渡してやると次のようになる。



影が入るようになったが右上が欠けてしまっている。これは最後に合成する画像のサイズがウィンドウの実サイズを元に計算されている為。そこで影で増えた分(40ピクセル)を補正してやる。



うまくいった。

- - - - -
「影で増えた分(40ピクセル)」はマジックナンバーで、定数や関数から取った値ではない。調べてみたが分からなかったので実測で出した(もし誰か情報を持っていたら是非教えて下さい...)。そういった定数や関数が無ければ、今回のようなマジックナンバーを埋め込むか、もしくは実行時に影付きの画像を作り、ウィンドウの実サイズと比較するしかない。

(追記)いろいろ書いたが、一旦すべてのウィンドウの画像(CGImage)が揃えられれば最終サイズは容易に出せるので実はそんなに問題ではない。