スクリーンショットの撮り方
目次- 1.0.0 ビューア
- 2.0.0 スクリーンの画像
- 3.0.0 ウインドウの画像(1)
- 4.0.0 ウインドウの画像(2)
- 5.0.0 PNG ファイルへの変換
- 6.0.0 ウインドウの特定
- 7.0.0 セルフタイマー
2004/09/28
スクリーンやウインドウの画像を撮りたいのだけどどうしたらよいの?
との質問を受けました。
Plan 9 はこのような問題をとても面白い方法で、そう、Plan 9 らしい方法で処理しています。それを紹介しましょう。
ビューア
まずは画像のビューアであるpage
から紹介します。page
は実際には PS ファイルや PDF なども読み取りかなり守備範囲が広い。マニュアルには general purpose document viewer と書かれている。(詳しくはマニュアルを参照してください。)
page
には多くのオプションがあるが、普通はオプションなしの
page ファイル ...の形で使用する。ファイルは複数指定できる。
実行すると画像が表示され、左ボタンで画像を動かし、右ボタンでファイルを選択し、中央のボタンを押すと次のようなメニューが出る。
スクリーンの画像
スクリーンの画像は仮想ファイルとして/dev/screenに置かれています。
page /dev/screenを実行しているとその事が確認できます。
ウインドウの画像(1)
同様にウインドウの画像は/dev/windowであるが
page /dev/windowを実行しても何も見えないはずです。(なぜでしょう?)
cp /dev/window /tmp/a page /tmp/aを実行してみれば、ヒントがつかめます。(今度は
/tmp/a
に page
を実行する直前のウインドウの様子が画像ファイルとして記録されているのが確認されます。)
ウインドウの画像(2)
我々がウインドウの内容を画像ファイルとして記録したい場合には、たいていの場合、そのウインドウの中でコマンドを投入するわけには行きません。従って他のウインドウから目的のウインドウの内容をコピーすることになります。
/dev/wsysの下にはスクリーン上の全てのウインドウ情報が置かれています。
各ウインドウには ID が付けられており、その ID は
cat /dev/winidで確認できます。数字が表示されますが、ウインドウごとに異なる数字を表示するのが確認されるでしょう。
ls /dev/wsysを実行すると全てのウインドウの ID が表示されます。
N
を ID とします。ls /dev/wsys/Nを実行すると ID が
N
のウインドウに関する情報を収めたいろいろなファイルがあることが分かります。これらはもちろん仮想ファイルです。term% ls /dev/wsys/1 --rw------- M 20 arisawa arisawa 0 Sep 29 08:47 /dev/wsys/1/cons ---w------- M 20 arisawa arisawa 0 Sep 29 08:47 /dev/wsys/1/consctl --rw------- M 20 arisawa arisawa 0 Sep 29 08:47 /dev/wsys/1/cursor ---w------- M 20 arisawa arisawa 0 Sep 29 08:47 /dev/wsys/1/kbdin --rw------- M 20 arisawa arisawa 0 Sep 29 08:47 /dev/wsys/1/label --rw------- M 20 arisawa arisawa 0 Sep 29 08:47 /dev/wsys/1/mouse --r-------- M 20 arisawa arisawa 0 Sep 29 08:47 /dev/wsys/1/screen --rw------- M 20 arisawa arisawa 0 Sep 29 08:47 /dev/wsys/1/snarf --r-------- M 20 arisawa arisawa 0 Sep 29 08:47 /dev/wsys/1/text --rw------- M 20 arisawa arisawa 0 Sep 29 08:47 /dev/wsys/1/wctl --rw------- M 20 arisawa arisawa 0 Sep 29 08:47 /dev/wsys/1/wdir --r-------- M 20 arisawa arisawa 0 Sep 29 08:47 /dev/wsys/1/window --r-------- M 20 arisawa arisawa 0 Sep 29 08:47 /dev/wsys/1/winid --r-------- M 20 arisawa arisawa 0 Sep 29 08:47 /dev/wsys/1/winname d-r-x------ M 20 arisawa arisawa 0 Sep 29 08:47 /dev/wsys/1/wsys/dev/wsys/1/windowが ID が 1 のウインドウの画像です。実際他のウインドウから
page /dev/wsys/1/windowを実行してみるとそのことが確認されます。
PNG ファイルへの変換
画像を収めた仮想ファイルの形式は Plan 9 による独自形式です。これを PNG 形式に変換するには (生成するファイルを/tmp/1.png
とすれば)topng /dev/wsys/1/window > /tmp/1.pngを実行します。
topng
で生成した PNG ファイルを page
が読み取れない事があります。page
は内部で png
を使用しており、png
に問題があると思えます。その場合でも topng
によって生成されたファイルは Mac OSX では正しく読み取れています。
PNG ファイルへの変換の他に GIF ファイルへ変換する事もできます。マニュアル jpg(1) を参照してください。残念ながら JPEG ファイルへの変換ツールは無いようです。
ウインドウの特定
多数のウインドウがあるときに、目標とするウインドウの ID を特定する必要があります。ウインドウの重なり順序情報を利用できれば目標とするウインドウがすぐに分かるのですが、Plan 9 のウインドウマネージャーであるrio
はどういうわけか、その情報をユーザに提供しません。(もちろん rio
の内部ではその情報を持っているはずです。) その事が例えば acme
を複数個開いたときに plumping が全ての acme
で発生するなどの問題の原因になっています。rio
の現在の仕様ではウインドウを特定するのに/dev/wsys/*/labelが役に立つでしょう。この内容を読めば、そこで実行中のプログラムの名前が分かります。例えば
acme
のウインドウはgrep acme /dev/wsys/*/labelで分かります。
セルフタイマー
時には、セルフタイマーを使用してウインドウのコピーをとりたい事もあります。このページの最初の画面はgrep page /dev/wsys/*/labelでウインドウ ID を調べ (例えば 3 とします)
sleep 10; topng /dev/wsys/3/window >/tmp/a.pngで得られたものです。