GetImage サンプル:Windows イメージ取得 API を示します
GetImage サンプルでは、WIA (Windows Image Acquisition) アプリケーション プログラミング インターフェイス (API: Application Programming Interface) の例を示します。
WIA API のセットにはファイル転送に必要な単純な API が含まれますが、インメモリ転送に必要な単純な API 呼び出しはありません。 GetImage は WiaGetImage という名前のラッパー関数を実装し、SelectDeviceDlg、DeviceDlg、idtGetBandedData の各 API の機能を組み合わせて、イメージの取得を 1 つの関数呼び出し内に完全にカプセル化します。
このサンプルは、コード自体が主な機能となっています。 WiaWrap、EventCallback、DataCallback、BitmapUtil、ProgressDlg の各ファイルは、インメモリ イメージ転送の正しい実装方法を示します。 この概要の後半にある「WIA API を使用したプログラミングに関する注意事項」セクションでは、WIA アプリケーション作成時の共通の落とし穴について詳しく説明し、サンプルにはその処理方法を示します。 このサンプルを参照用として読み込むか、またはサンプル コードをライブラリとして直接使用できます。 各関数の使い方については、ヘッダー ファイルのコメントで詳しく説明しています。
セキュリティに関するメモ |
---|
このサンプル コードは概念を示すためのものであり、その概念に関連するコードのみを示しています。特定の環境について必ずしもセキュリティ要件を満たしていませんので、そのまま使用しないでください。セキュリティおよびエラー処理コードを追加して、プロジェクトをより安全かつ堅牢にすることをお勧めします。これらのサンプル コードは、現状有姿のままで提供されるものであり、一切保証されていません。 |
サンプルとそのインストール手順を取得するには
Visual Studio のサンプルにアクセスするには
[ヘルプ] メニューの [サンプル] をクリックします。
既定では、これらのサンプルは drive:\Program Files\Microsoft Visual Studio 10.0\Samples\ にインストールされています。
必要条件
このサンプルを実行できるのは、Windows XP 以降です。
また、Microsoft Windows SDK をインストールしている必要があります。
サンプルのビルドと実行
このサンプルをビルドして実行するには
Visual Studio で、ソリューション GetImage.sln を読み込みます。
ソリューション エクスプローラーで、プロジェクトを右クリックし、[プロパティ] をクリックします。 次のプロパティを設定します。
C++ フォルダー、 全般プロパティ ページ: ヘッダー ファイル (たとえば、c:\Microsoft Windows SDK \include) が格納されているディレクトリを追加する追加のインクルード ディレクトリ Windows SDK プロパティを変更します。
リンカー フォルダー、 全般プロパティ ページ: ライブラリ ファイル (たとえば、c:\Microsoft Windows SDK \lib) が含まれているディレクトリを追加するのには追加のライブラリ ディレクトリ Windows SDK プロパティを変更します。
[ビルド] メニューの [ビルド] をクリックします。
メニューの [デバッグ、 デバッグなしで開始] をクリックします。
サンプル アプリケーションの [File] メニューには、[From scanner or camera] という名前のコマンドが 1 つあります。 WIA デバイス (またはデバイス エミュレーター) を接続すると、メニュー項目が有効になります。 ユーザーがメニュー コマンドを選択すると、[WIA Device Selection]、[Image Selection]、[Image Transfer] の各ダイアログ ボックスが連続して表示されます。 デバイスとイメージの選択ダイアログ ボックスはシステムに用意されている共通のダイアログ ボックスであり、転送ダイアログ ボックスはこのサンプルに実装されます。 最後に、転送されたイメージが子ウィンドウに表示されます。
サンプル内のファイル
ファイル |
説明 |
---|---|
WiaWrap.cpp |
より単純な WIA 操作に必要なラッパー関数が含まれます。 |
WiaWrap.h |
WiaWrap.cpp のヘッダー ファイルです。 |
EventCallback.cpp |
WIA デバイスのイベントに必要なコールバック関数を実装します。 |
EventCallback.h |
EventCallback.cpp のヘッダー ファイルです。 |
DataCallback.cpp |
データ転送に必要なコールバック関数を実装します。 |
DataCallback.h |
DataCallback.cpp のヘッダー ファイルです。 |
BitmapUtil.cpp |
デバイスに依存しないビットマップ (DIB: Device Independent Bitmap) 関数が含まれます。 |
BitmapUtil.h |
BitmapUtil.cpp のヘッダー ファイルです。 |
ProgressDlg.cpp |
単純なプログレス ダイアログ ボックスを実装します。 |
ProgressDlg.h |
ProgressDlg.cpp のヘッダー ファイルです。 |
GetImage.cpp |
アプリケーションのメイン エントリ ポイントを実装します。 |
GetImage.rc |
プロジェクトのリソースが含まれます。 |
resource.h |
リソース識別子のヘッダー ファイルです。 |
MainWnd.cpp |
メイン フレーム ウィンドウを実装します。 |
MainWnd.h |
MainWnd.cpp のヘッダー ファイルです。 |
BitmapWnd.cpp |
イメージ表示ウィンドウを実装します。 |
BitmapWnd.h |
BitmapWnd.cpp のヘッダー ファイルです。 |
StdAfx.cpp |
プリコンパイル済みヘッダー ファイルです。 |
StdAfx.h |
頻繁に使用される標準のシステム ファイルが含まれます。 |
WIA API を使用したプログラミングに関する注意事項
アプリケーションをデバイスとイメージの選択、メニュー項目を通じて利用できるという、 メニューをファイル」の「スキャナーまたはカメラから..."の をお勧めします。 システムに WIA デバイスがない場合は、このメニュー項目が淡色表示されていることがあります。
アプリケーションを開発する場合は、シリアル接続のカメラと USB 接続のカメラ、およびスクロール フィード型の ADF フラットベッド スキャナーを使用して、アプリケーションをテストすることをお勧めします。 テストには、Windows DDK で利用可能なソフトウェア専用デバイス エミュレーターも使用できます。
通常、スクロール フィード型のスキャナーでは、データ転送の開始時にイメージの高さを認識できません。したがって、ビットマップ ヘッダーのイメージのサイズとイメージの高さについて 0 が返されることがあります。 この場合、新しいデータの到着時にコールバック関数によってバッファーを拡張したり、転送の完了時に高さを明示的に計算したりする必要があります。
DeviceDlg API が自動ドキュメント フィーダ (ADF) で使用する場合は、1 つのページをスキャンする ADF、API を設定します。 複数のページが望ましい場合は、アプリケーションが明示的に WIA_DPS_PAGES ページが要求の数、または ALL_PAGES 値設定する必要があります。
SelectDeviceDlg DeviceDlg idtGetData、 idtGetBandedDataS_FALSE マクロに戻り値を確認するのには十分ではありませんので、ユーザー、キャンセルした場合の API 戻り SUCCEEDED 。 プログラマは S_FALSE 明示的にチェックする必要があります。 同様に、ReadMultiple および WriteMultiple API では S_FALSE 関数の引数は正しいのですが、プログラマが明示的に S_FALSE に対して戻り値をチェックする必要がありますので、関数、要求された操作を実行できませんと返します。
キャンセルできるプログレス ダイアログ ボックスをアプリケーションで表示する場合は、そのダイアログ ボックスを別のスレッドに表示する必要があります。 データ転送スレッドは転送が完了するまでブロックされるため、到着したウィンドウ メッセージはすぐに処理できません。 同じスレッドで作成されたプログレス ダイアログ ボックスおよびその [Cancel] ボタンは、ユーザーの入力に対する反応が遅くなります。
BandedDataCallback のみが返されるときに、データ転送をキャンセルできます。 BandedDataCallback 数秒ごと呼び出される場合がありますので、アプリケーションは、キャンセル操作が進行中であることをユーザーに示す必要があります。 たとえば、[Cancel] ボタンを無効にしたり、待機メッセージを表示したりできます。
Keywords
このサンプルでは、次のキーワードを使用します。
IWiaDevMgr, IWiaDevMgr::SelectDeviceDlg, IWiaEventCallback, IWiaEventCallback::ImageEventCallback, IWiaItem, IWiaItem::DeviceDlg, IWiaPropertyStorage, IWiaPropertyStorage::ReadMultiple, IWiaPropertyStorage::WriteMultiple, IWiaDataTransfer, IWiaDataTransfer::idtGetBandedData, IWiaDataCallback, IWiaDataCallback::BandedDataCallback