アプリからスキャンする
このトピックでは、フラットベッド、フィーダー、または自動構成のスキャン ソースを使用して、アプリからコンテンツをスキャンする方法について説明します。
重要な API
アプリからスキャンするには、まず、新しい DeviceInformation オブジェクトを宣言し、 DeviceClass 型を取得して、使用可能なスキャナーを一覧表示する必要があります。 WIA ドライバーを使用してローカルにインストールされているスキャナーのみが一覧表示され、アプリで使用できます。
アプリで使用可能なスキャナーが一覧表示されたら、スキャナーの種類に基づいて自動構成されたスキャン設定を使用するか、使用可能なフラットベッドまたはフィーダー スキャン ソースを使用してスキャンできます。 自動構成設定を使用するには、スキャナーが自動構成に対して有効になっている必要があり、フラットベッドスキャナーとフィーダー スキャナーの両方を装備していない必要があります。 詳細については、「 自動構成スキャン」を参照してください。
使用可能なスキャナーを列挙する
Windows はスキャナーを自動的に検出しません。 アプリがスキャナーと通信するには、この手順を実行する必要があります。 この例では、スキャナー デバイスの列挙は、 Windows.Devices.Enumeration 名前空間を使用して行われます。
- まず、これらの using ステートメントをクラス定義ファイルに追加します。
using Windows.Devices.Enumeration;
using Windows.Devices.Scanners;
- 次に、スキャナーの列挙を開始するデバイス ウォッチャーを実装します。 詳細については、「 デバイスの追加」を参照してください。
void InitDeviceWatcher()
{
// Create a Device Watcher class for type Image Scanner for enumerating scanners
scannerWatcher = DeviceInformation.CreateWatcher(DeviceClass.ImageScanner);
scannerWatcher.Added += OnScannerAdded;
scannerWatcher.Removed += OnScannerRemoved;
scannerWatcher.EnumerationCompleted += OnScannerEnumerationComplete;
}
- スキャナーが追加されたときのイベント ハンドラーを作成します。
private async void OnScannerAdded(DeviceWatcher sender, DeviceInformation deviceInfo)
{
await
MainPage.Current.Dispatcher.RunAsync(
Windows.UI.Core.CoreDispatcherPriority.Normal,
() =>
{
MainPage.Current.NotifyUser(String.Format("Scanner with device id {0} has been added", deviceInfo.Id), NotifyType.StatusMessage);
// search the device list for a device with a matching device id
ScannerDataItem match = FindInList(deviceInfo.Id);
// If we found a match then mark it as verified and return
if (match != null)
{
match.Matched = true;
return;
}
// Add the new element to the end of the list of devices
AppendToList(deviceInfo);
}
);
}
スキャン
- ImageScanner オブジェクトを取得する
各ImageScannerScanSource列挙型について、 Default、AutoConfigured、Flatbed、または Feeder のいずれであっても、まず次のように ImageScanner.FromIdAsync メソッドを呼び出して、ImageScanner オブジェクトを作成する必要があります。
ImageScanner myScanner = await ImageScanner.FromIdAsync(deviceId);
- スキャンのみ
既定の設定でスキャンするには、アプリは Windows.Devices.Scanners 名前空間に依存してスキャナーを選択し、そのソースからスキャンします。 スキャン設定は変更されません。 可能なスキャナーは、自動構成、フラットベッド、またはフィーダーです。 この種類のスキャンでは、フィーダーの代わりにフラットベッドのように、間違ったソースからスキャンした場合でも、スキャン操作が成功する可能性が最も高くなります。
注: ユーザーがスキャンするドキュメントをフィーダーに置くと、スキャナーは、代わりにフラットベッドからスキャンします。 ユーザーが空のフィーダーからスキャンしようとすると、スキャン ジョブはスキャンされたファイルを生成しません。
var result = await myScanner.ScanFilesToFolderAsync(ImageScannerScanSource.Default,
folder).AsTask(cancellationToken.Token, progress);
- 自動構成、フラットベッド、またはフィーダーソースからのスキャン
アプリは、デバイスの Auto-Configured Scanning を使用して、最適なスキャン設定でスキャンできます。 このオプションを使用すると、デバイス自体は、スキャンされるコンテンツに基づいて、カラー モードやスキャン解像度などの最適なスキャン設定を決定できます。 デバイスは、新しいスキャン ジョブごとに実行時にスキャン設定を選択します。
注: すべてのスキャナーがこの機能をサポートしているわけではないため、アプリはこの設定を使用する前に、スキャナーがこの機能をサポートしているかどうかを確認する必要があります。
この例では、アプリは最初にスキャナーが自動構成できるかどうかを確認してからスキャンします。 フラットベッド スキャナーまたはフィーダー スキャナーを指定するには、 AutoConfigured を Flatbed または Feeder に置き換えます。
if (myScanner.IsScanSourceSupported(ImageScannerScanSource.AutoConfigured))
{
...
// Scan API call to start scanning with Auto-Configured settings.
var result = await myScanner.ScanFilesToFolderAsync(
ImageScannerScanSource.AutoConfigured, folder).AsTask(cancellationToken.Token, progress);
...
}
スキャンをプレビューする
フォルダーにスキャンする前に、スキャンをプレビューするコードを追加できます。 次の例では、アプリは Flatbed スキャナーがプレビューをサポートしているかどうかを確認し、スキャンをプレビューします。
if (myScanner.IsPreviewSupported(ImageScannerScanSource.Flatbed))
{
rootPage.NotifyUser("Scanning", NotifyType.StatusMessage);
// Scan API call to get preview from the flatbed.
var result = await myScanner.ScanPreviewToStreamAsync(
ImageScannerScanSource.Flatbed, stream);
スキャンを取り消す
次のように、ユーザーがスキャンの途中でスキャン ジョブを取り消すことができます。
void CancelScanning()
{
if (ModelDataContext.ScenarioRunning)
{
if (cancellationToken != null)
{
cancellationToken.Cancel();
}
DisplayImage.Source = null;
ModelDataContext.ScenarioRunning = false;
ModelDataContext.ClearFileList();
}
}
進行状況でスキャンする
- System.Threading.CancellationTokenSource オブジェクトを作成します。
cancellationToken = new CancellationTokenSource();
- 進行状況イベント ハンドラーを設定し、スキャンの進行状況を取得します。
rootPage.NotifyUser("Scanning", NotifyType.StatusMessage);
var progress = new Progress<UInt32>(ScanProgress);
画像ライブラリへのスキャン
ユーザーは、 FolderPicker クラスを使用して任意のフォルダーを動的にスキャンできますが、ユーザーがそのフォルダーをスキャンできるようにするには、マニフェストで Pictures Library 機能を宣言する必要があります。 アプリの機能の詳細については、「 App 機能宣言」を参照してください。
Windows developer