SANE-Tutorial-JP 著者: David Mosberger 翻訳: 川岸 良治 < kawagisi@yk.rim.or.jp > 第1版 1999年7月13日作成 この文書は、スキャナ用 API の規格である SANE の仕組み、パッケージの使 い方、プログラミングの概要等について解説したものです。 The SANE Scanner Interface David Mosberger David.Mosberger@acm.org この記事は Linux Journal Issue 47, March 1998 に発表したものです。 概要 SANE は `Scanner Access Now Easy' の略語です。これは、フラッ トベッドスキャナ、ビデオ、スチルカメラ、フレームグラバ(画面 キャプチャ)のようなラスター画像を作るデバイスから画像を取り 出すことができる汎用のインタフェースです。SANE の意義は、個 々のデバイスの特性を気にせずに画像処理アプリケーションが書け るようになるということです。これを別の視点から見ると、 SANE に準拠したデバイスドライバをたった一度書くだけでいいというこ とです。同じデバイスドライバをSANE に準拠した別のアプリケー ションからも使えるようになるのです。 1. はじめに Linux で画像をスキャンしたいと思ったことはありませんか? も しそうなら、たぶんスキャナドライバパッケージの多さに当惑する かもしれません。これを書いている時点で、少なくとも 14 の Linux 用スキャナドライバパッケージが存在します。個々のパッケ ージは高品質ではあるものの、どのドライバパッケージをどのス キャナに使えばよいのか分からないことがよくあります。おまけ に、あるパッケージはコマンドライン・インタフェース、別のは tcl/tk ベースのグラフィカル・フロントエンドがある、さらに完 全武装のグラフィカル・フロントエンドを持ったものもあるという 具合です。バラエティは生活を豊かにするとは言うものの、この場 合はかなり大きな頭痛の種です。 SANE はこのジレンマを解決するために作られました。基本的なア イデアは単純です。つまり、汎用的でよく出来た API(Application Programming Interface) があれば、スキャナドライバから独立し たアプリケーションを書くのは容易です。従って、新しいスキャナ ドライバの作者は、ドライバ用のアプリケーションを書くことを心 配しなくてよいのです。さらにアプリケーション・プログラマに とっても SANE は汎用的なので、いずれは制御されるであろうデバ イスと独立してアプリケーションを書くことが出来るという利点が あるのです。 10 の異なるデバイスをサポートするために、5つのアプリケーショ ンが欲しいとします。古いアプローチでは、5×10=50 で 50 もの プログラムを書かなければなりません。SANE では 5+10=15 で 15 のプログラムを書くだけでよいのです。 SANE はユーザにもメリッ トがあります。ユーザは自分が最も気に入ったアプリケーションを 選択する自由が得られ、それをユーザがアクセス可能な全ての画像 取込みデバイスを制御するために使用できます。つまり SANE は、 使用中の特定のデバイスに一貫したインタフェース独立性を与えて くれるのです。 もちろん SANE がこのような汎用インタフェースの最初の試みでは ありません。 TWAIN, PINT, Linux hand-scanner というインタ フェースを耳にしたことがあるかもしれません。問題なのは,これ らの古いインタフェースには、アプリケーションからデバイスへ の(またはその逆の)インタフェースが不足していることです。例え ば、PINT は本当にいくぶん原始的なカーネルレベルのインタフェ ースであり、 hand-scanner インタフェースは文字どおりハンドス キャナに限定されています。対照的に SANE はラスター画像を取り 込むデバイスをサポートするのに一般には充分です。SANE に最も 近いのは、たぶん TWAIN です。 SANE と TWAIN の韻は偶然の一致ではないことは事実ですが、それ は別の話です。 TWAIN が SANE ではない主な理由は、TWAIN がア プリケーションに代わってドライバの中にデバイスを制御するため のグラフィカル・ユーザインタフェースを置くことです。これは スキャナが動作しているマシンとは別のマシンでアプリケーション が動いているといった Linux またはネットワーク環境には適して いません。SANE はこれと対照的に、実際のドライバとそれを制御 するアプリケーションの厳密な分離を強要します。実際、現在の SANE ディストリビューションにはネットワーク経由でのスキャン がサポートされています。 2. SANE を使う SANE を使うには下記の ftp ディレクトリから最新バージョンの ディストリビューションを入手します。 SANE に付いてくるグラフィカル・ユーザインタフェースをビルド したいなら、 GIMP あるいは最低限でも GTK を入手、ビルド、イ ンストールする必要があります。 GIMP と GTK はいずれも から入手します。GTK は元々 GIMP 用に開発されたユーザインタ フェースのツールキットですが、今では SANE を含む他の多くのプ ロジェクトに採用されています。 SANE ディストリビューションは GIMP/GTK ライブラリが無くてもうまくビルドできます。しかし、 その場合グラフィカル・ユーザインタフェース・プログラムは何ひ とつビルドされず、多くの楽しみが奪われてしまいます。従ってサ ーバ用のみに SANE をビルドするのでなければ、最低でも GTK (GIMPではなく) をインストールすることを勧めます。 SANE ディストリビューションを入手したら圧縮されている tar ファイルを展開し、 README ファイルの内容に従って下さ い。README は SANE をビルドし、インストールする方法を説明し ています。また PROBLEMS というファイルにも目を通して下さい。 これには既知の問題点と、するべきことのリストがあります。 SANE を動作させるためにスキャナやカメラが必須ではないことに 注意して下さい。 SANE ディストリビューションには、PNM (portable `anymap')ファイルを読むことによりスキャナをシミュ レートする仮想ドライバが入っています。また、SANE は Linux に 限定されません。Linux Alpha, Linux x86, Linux m68k 以外にも AIX, Digital Unix, FreeBSD, HP-UX, IRIX, NetBSD, SCO, Solaris, SunOS また OS/2 でも動作します。 SANE をインストールしたら下記のコマンドを入力してみましょう。 scanimage --list-devices すると以下のように出力される筈です。 device `mustek:/dev/scanner' is a Mustek MFC-06000CZ flatbed scanner device `pnm:0' is a Noname PNM file reader virtual device device `pnm:1' is a Noname PNM file reader virtual device この例では Mustek のスキャナは mustek:/dev/scanner という名 前で利用可能であり、また pnm:0 と pnm:1 という PNM ファイル を読むために使う 2 つの仮想デバイスも利用できることを、この リストは表しています。個別のデバイスの全てのオプションを表示 するには、例えば pnm:0 の場合、次のようにします。 scanimage --device pnm:0 --help こうすると図1 のようなヘルプメッセージが出ます。 ____________________________________________________________ Usage: scanimage [OPTION]... Start image acquisition on a scanner device and write PNM image data to standard output. -d, --device-name=DEVICE use a given scanner device -h, --help display this help message and exit -L, --list-devices show available scanner devices -v, --verbose give even more status messages -V, --version print version information Options specific to device `pnm': Source Selection: --filename <\<>string> [/tmp/input.ppm] The filename of the image to be loaded. Image Enhancement: --brightness -100...100% [0] Controls the brightness of the acquired image. --contrast -100...100% [0] Controls the contrast of the acquired image. --grayify[=(yes|no)] [no] Load the image as grayscale. --three-pass[=(yes|no)] [no] Simulate a three-pass scanner by returning 3 separate frames. For kicks, it returns green, then blue, then red. --hand-scanner[=(yes|no)] [no] Simulate a hand-scanner. Hand-scanners often do not know the image height a priori. Instead, they return a height of -1. Setting this option allows one to test whether a front end can handle this correctly. --default-enhancements Set default values for enhancement controls (brightness & contrast). Figure 1: Scanimage Help Message For pnm:0 Pseudo-Device 図1: pnm:0 仮想デバイス用 scanimage のヘルプメッセージ ____________________________________________________________ SANE パッケージには、Scanimage プログラムの使い方を説明した 詳細なマニュアルページが付いてきます。例として input.ppm と いう名前の PPM ファイルを想定します。下記のコマンドで、この 画像を「スキャン」し、かつ明るさを 50%増加させることができま す。 scanimage --device pnm --brightness 50 input.ppm > output.ppm xv のような画像ビューワで output.ppm ファイルを見る と、output.ppm が著しく明るくなっていることが分かるでしょう。 あなたはこう言うかもしれません − 「すごい。だけどグラフィカ ル・ユーザインタフェースはないの?」。SANE をビルドした時点 で GTK ライブラリがインストール済みであれば、xscanimage とい うプログラムを呼び出すことができます。これは、利用可能なデバ イス一覧のダイアログボックスを表示します。`pnm:0' をダブルク リックすると図 2 に示すダイアログが表示されます。 << 図2: SANE ダイアログウィンドウ >> ( の Figure 2: SANE Dialog Window 参照 ) ご覧のようにダイアログには 2 つの `Filename' というテキスト 入力ボックスと `Brightness' というスライダがあります。最初の テキスト入力ボックスに output.ppm , 2 つ目のボックスに input.ppm と入力し、Brightness のスライダを 50.0 に移動させ てから左下の Scan ボタンを押すと、前述のコマンドラインで実行 した scanimage と同じ結果が得られます。もちろん本番のスキャ ンをする前に、右下の Preview ボタンを押してプレビュー・ウィ ンドウ(図3) を表示させることもできます。 << 図3: SANE プレビュー・ウィンドウ >> ( の Figure 3: SANE Preview Window 参照 ) プレビュー・ウィンドウでは、 Acquire -> Preview ボタンを押す とスキャン本番の画像を低解像度でプレビュー表示できます。例え ば、Brightness スライダを操作すると、画像の明るさがどのよう に影響されるかが分かります。スライダを動かしてから Acquire Preview ボタンを押すとプレビュー表示が更新されます。 スキャナやカメラで画像をスキャンする際、様々な方法の画像補正 をしたいことがよくあります(例えば画像をシャープにするな ど)。xscanimage プログラムは幸いにも GIMP の拡張として実行さ せることができます。このようにするには、GIMP の plug-ins ディレクトリから xscanimage のバイナリにシンボリックリンクを 張るだけです。SANE をインストールしたディレクトリがデフォル トと同じだとすると、下記のコマンドでシンボリックリンクを張れ ます。 ln -s /usr/local/bin/xscanimage ~/.gimp/plug-ins シンボリックリンクを張ると、 GIMP の次回起動時から xscanimage は `Xtns' (拡張) メニューに組み込まれます。これは `Xtns -> Acquire' そしてうになります。この方法で起動する場 合、Scan ボタンを押して新しくスキャンした画像は(ディスクにセ ーブするかわりに) GIMP ウィンドウの内側に置かれます。これ で、通常の GIMP の画像処理機能を、取り込んだ画像をセーブする 前の補正に使えるようになります。 この PNM 仮想デバイスはちょっと変に見えるかもしれませんが、 本物のスキャナインターフェースはどのように見えるのでしょう か?図 4 は、Mustek フラットベッド・スキャナでの xscanimage ダイアログです。この図は、xscanimage の他の機能:ツールチッ プ(バルーンヘルプとも言う)のデモンストレーションも行っていま す。ツールチップがあれば、新規ユーザがスキャナやカメラの能力 を理解しやすくなります。図の中で、マウスは Scan Source メ ニューを指し、その結果このメニューのヘルプ情報がマウスポイン タの下の黄色い箱の中に表示されています。ツールチップは新規ユ ーザには便利ですが、しばらくすると自分なりの方法でやりたくな ります。そこで xscanimage は上級者向けに Preferences サブメ ニューでツールチップを出さないようにすることもできます。 << 図4:xscanimage での Mustek ダイアログウィンドウ >> ( の Figure 4: Mustek Dialog Window for xscanimage 参照 ) ご覧のように Mustek ダイアログは PNM 仮想デバイスインタフェ ースとはかなり異なるように見えます。これは元になるデバイスが 異なる能力を持っているからです。デバイスダイアログは、選択さ れたデバイスに依存するだけでなく、デバイスのモードにも依存し ます。例えばダイアログの下の方にある `Use custom gamma table' オプションをオンにするとインタフェースが変更され、結 果として図 5 のようになります。ご覧のようにダイアログの右半 分はグラフエディタになり、輝度と RGB のガンマテーブルを変更 できます。言い換えれば xscanimage はアクティブな、または与え られたスキャンモードでの重要なオプションを正確に表示するの で、ユーザが混乱しにくくなります。 << 図5:ガンマテーブルエディタ付き Mustek ダイアログ >> ( の Figure 5: Mustek Dialog With Gamma Table Editor 参照 ) 図の右半分にある画像の輝度ガンマテーブルを見ると、xscanimage を起動する度にガンマテーブルを定義していたら、むしろいらいら するのではないかと思うかもしれません。理想的なテーブルが見つ かって、もしそれらをセーブすることができるなら素晴らしいです ね。このために、xscanimage は Preferences サブメニューの項目 で現在のデバイス設定をセーブできます。セーブしておけば xscanimage を起動する度に、そのデバイスで最後にセーブされた オプションが自動的に読み込まれます。 3. SANE に付属するもの SANE ディストリビューションに含まれるいくつかのプログラムの 使い方を見てきました。その他に何があるのかを書きます。これを 書いている時点で、パッケージには以下のデバイス用のドライバが 入っています。 o Connectix QuickCam (カラーとモノクロ) o Epson SCSI スキャナ o Hewlett-Packard ScanJet SCSI スキャナ o Microtek SCSI スキャナ o Mustek SCSI フラットベッドスキャナ (1 パスおよび 3 パススキャナ のいずれもサポートされています) o PINT デバイス PINT は NetBSD, OpenBSD, SunOS 用の Unix カーネルインタ フェースです。 SANE の PINT ドライバは PINT サポートがあ るスキャナにアクセスできます。 o ほとんどの UMAX SCSI スキャナ 他の多くのスキャナ、カメラのサポートは計画中で、その内の いくつかはこの記事を読むまでの間に出来ているかもしれません。 最新情報は参考文献のところに書かれているウェブペーを見て下 さい。 利用可能なアプリケーションは、コマンドラインの scanimage と グラフィカルな xscanimage (スタンドアロンで、または GIMP の 拡張として)と (Connectix QuickCam のような)連続した画像のス トリームを作るカメラに適したグラフィカルユーザインタフェース の xcam です。 加えて、SANE には Python や Java 用の API があり、またリモー トデバイスへのネットワーク経由のアクセスを可能にする saned というネットワークデーモンがあります。これはパーミッションを 適切に設定してあれば、アメリカで動作しているカメラをヨーロッ パにあるマシンから制御することもできます。これは全て SANE と インターネットのサービスによるものです。 4. どのように動作するか SANE アプリケーションをビルドする際、libsane.so という共有ラ イブラリがリンクされている必要があります。実際には、lib- sane.so は SANE ドライバ群の一つへのシンボリックリンクに過ぎ ません。どの SANE ドライバも同じインタフェースを提供するの で、いつでも libsane.so へのシンボリックリンクを変更できます し、アプリケーションが使用しているドライバを効果的に変更でき ます。全てのアプリケーションをリンクし直すことなくドライバを アップグレードできるため、ある意味これは便利ですが、スキャン デバイスを切替えたい時はシンボリックリンクを変更しなければな らず、かなり不便です。このため SANE は、dll および net とい う 2 つの仮想デバイスドライバをサポートしています。これらは 仮想ドライバです − なぜなら物理的デバイスに話しかけるのでは なく、図 6 に示すように他の SANE ドライバと話すからです。 << 図 6: 取りうる SANE 階層 >> ( の Figure 6: Possible SANE Hierarchy 参照 ) マシン A にとって、libsane.so のシンボリックリンクは dll 仮 想ドライバ (libsane-dll.so と呼ばれる)を指しています。仮想ド ライバは他の SANE ドライバにアクセスするためにダイナミックリ ンクライブラリ(dll)を使用します。例示した図では dll は pnm, mustek, net ドライバを使うために設定されています。 net ドライバもやはり仮想ドライバで、これはマシン B で動作し ている SANE デーモン(saned)に接続することにより、リモートス キャナへのアクセスを提供します。さて、マシン B は、他のいく つかのドライバにアクセスするために再び dll を使用します。ご 想像のように、システム管理者は、マシン A と B を正しく設定し ないといけません。 libsane.so を dll 仮想ドライバへのシンボリックリンクとするの は、普通に行われるやり方です。でも net 仮想ドライバへのリン クにしたり、単純に mustek ドライバへのリンクにしたりもできな い理由はないはずです。もちろん、例えば mustek にリンクさせた 場合には、アプリケーションは mustek のドライバにしかアクセス できなくなるでしょう。でも、これは特定の環境においては完全に 合理的であるかもしれません。 このアプローチは大変柔軟ですが、興味深い質問が出てきます。こ のような環境でデバイスの名前をどうやってつけるのでしょう?答 えは、リアルドライバは全てそれ自身の名前のスペースを持ってい る、です。例えば、Mustek と HP ドライバはデバイスを制御する /dev/scanner のような Unix スペシャルデバイスのパスを使いま す。 仮想ドライバには、もう少し面白いことがあります。 dll は各ド ライバ名がユニークであることを保証しなければならないので、各 々の従属デバイス名と従属ドライバ名をコロンで区切ったものを接 頭辞としてつけます。従って、マシン A では mustek のスキャナ は mustek:/dev/scanner と呼ばれます。net 仮想ドライバも同様 に、リモートデバイス名とリモートホスト名を接頭辞としてつけま す(やはりコロンがセパレータとして使われます)。 例えば、マシン B の HP スキャナ1 は、net:B.domain.com:hp:/dev/scanner1 という名前でマシン A に現れます。野暮ったい名前ですが、名前に含まれる情報は実際に 極めて有用です。 デバイス名は SANE の階層を通して個々のデバイスへ割り振られま す (本質的には、Unix のパス名に似ています)。例えば、マシン B がダウンしたことが分かれば、 net:B.domain.com:hp:/dev/scanner1 も同じようにダウンしている ことは、明白です。 これらの名前がすごく嫌なら、ユーザまたはシステム管理者が、ア プリケーションを簡潔なエイリアスで定義することもできます。例 えば、ユーザがアプリケーションで上記デバイス名を(初心者には 分かり易い) `HP Scanner 1' にリネームできます。 5. SANE のプログラミング 定義により、SANE はそれを使うプログラムと同じくらい良い唯一 のものです。これは、SANE を使用するアプリケーションやデバイ スが多い程、より楽しくなることを意味します。SANE ディストリ ビューションには、SANE API を説明した詳細なドキュメントも付 いてきますが、インタフェースは極めてシンプルです。下記に示 す6個のメイン関数があります。 handle <- sane_open (device-name): SANE デバイスを名前 (例えば pnm:0)でオープンします。 sane_close (handle): SANE デバイスをクローズします。 sane_get_option_descriptor (handle, option-number): デバイスが利用可能な制御はなにかを問い合わせるために使われま す (PNM 仮想デバイスドライバの明るさ制御のような)。 sane_control_option (handle, option-number, action, value): オプションの値を取得または設定するために使われます。例えば、 明るさのオプションの値を 50% にセットするために使われます。 加えて、いくつかのオプションはドライバが適切な値をとるように する自動モードをサポートしています。このようなオプションで は、sane_control_option() は自動モードをオンまたはオフにする ためにも使われます。 sane_start (handle): 画像の取り込みを開始するために使われます。 bytes-read <- sane_read (handle, buffer, buffer-size): 全ての画像を取り込むまで、実際の画像データを読むために使われ ます。 SANE API はシンプルに設計されています。目標は、洗練されたドライバとア プリケーションを可能にする充分な機能を提供しながらも、シンプルなタスク を少ない時間で成し遂げることでした。HP スキャナ用の hpscanpbm プログラ ムを SANE ドライバに変換するのに要したのはふた晩という事実は、設計のシ ンプルさの最良の証拠です。逆に、Mustek ドライバと xscanimage はかなり 困難なプログラムですが、SANE はそれらに順応するのに問題はありません。 6. SANE と商用のアプリケーション/ドライバ 商用の SANE ドライバまたはアプリケーションに関する私たちの見 解は何でしょう? GNU Public License の精神によれば、SANE プ ログラムのソースを持つことは好ましいことです。しかし、ダイナ ミックロードされる、Linux と他のプラットホーム用のダイナミッ クローディングをサポートする商用 SANE ドライバを書くことは許 されます (ドライバは常にダイナミックロードされるので、これは 特別な作業を生じません)。同じ理由で、共有ライブラリ lib- sane.so にリンクする商用アプリケーションを書くのも正しいこと です。この見解を支える基本的な考え方は以下の通りです。 1. 商用とフリープログラムの健全な競争は財産であって負債では ない。 2. より幅広く SANE が使用されれば、Linux/Unix コミュニティに とってさらによい状況になる。 7. 将来の計画 ごく近い将来の計画は、もっと多くのデバイスのサポートを追加す ることです。例えば、Agfa と Plustek のスキャナ、Nikon フィル ムスキャナのドライバが計画されています。また、よりポピュラー なデジタルカメラのドライバが間もなく実現する可能性があります。 ネットワークの接続性で最良のものを得るために、Java の実行が 可能なウェブブラウザからスキャナを制御できる Java のスキャナ アプリケーションを実装する計画もあります。 長期計画では、オーディオソースやビデオテープレコーダを含む他 のマルチメディア・デバイスをSANE が包含するのが一般化するこ とに興味があるでしょう。 言い換えれば、SANE は始まったばかりです。そして多くのわくわ くするようなプロジェクトがあります。あなたがあらゆる意味で、 これらのどれかに参加することに興味があるなら SANE メーリング リストを通して他の開発者と文通して下さい。メーリングリストと 他の価値あるリソースが SANE のホームページにあります。 8. 謝辞 SANE プロジェクトは、多くの人達の継続的なサポート無しには やってこれなかったでしょう。中でも、Andreas Beck, Gordon Matzigkeit, Patrick Reynolds, Tristan Tarrant による貢献 は、SANE を夢から現実のものに変換するために決定的でした。 同様に Michael K. Johnson と Jeremy Rosenberger が、この記事 の初期のドラフトバージョンのフィードバックをくれたことにも感 謝します。 9. 日本語版について この文書は Linux Journal Issue 47, March 1998 に掲載さ れ、SANE のホームページ で "Tutorial" として公開されている文書を翻訳したものです。翻訳 および公開することに関し SANE プロジェクトの了承を得ました。 履 歴: 第1版 1999年7月13日 版権等: オリジナルの文書と同様に、この日本語版も GPL(GNU General Public License)に従います。 謝 辞:日本語版作成にあたり、以下のJF メンバーの方に御協力 頂きました。有難うございます。 福島 於修さん < fuku@amorph.rim.or.jp > 武井 伸光さん < takei@cc.kochi-u.ac.jp > 中野 武雄さん < nakano@apm.seikei.ac.jp > Hiro Sugawara さん < hiro@arkusa.com > 連絡先: 日本語版の誤訳等の指摘、質問、改良に関する提案、ご意見等は R.川岸 < kawagisi@yk.rim.or.jp > または JF プロジェクト 宛にお願いします。