アプリからスキャンする

このトピックでは、フラットベッド、フィーダー、または自動構成のスキャン ソースを使用して、アプリからコンテンツをスキャンする方法について説明します。

重要な API

アプリからスキャンするには、まず、新しい DeviceInformation オブジェクトを宣言し、 DeviceClass 型を取得して、使用可能なスキャナーを一覧表示する必要があります。 WIA ドライバーを使用してローカルにインストールされているスキャナーのみが一覧表示され、アプリで使用できます。

アプリで使用可能なスキャナーが一覧表示されたら、スキャナーの種類に基づいて自動構成されたスキャン設定を使用するか、使用可能なフラットベッドまたはフィーダー スキャン ソースを使用してスキャンできます。 自動構成設定を使用するには、スキャナーが自動構成に対して有効になっている必要があり、フラットベッドスキャナーとフィーダー スキャナーの両方を装備していない必要があります。 詳細については、「 自動構成スキャン」を参照してください。

使用可能なスキャナーを列挙する

Windows はスキャナーを自動的に検出しません。 アプリがスキャナーと通信するには、この手順を実行する必要があります。 この例では、スキャナー デバイスの列挙は、 Windows.Devices.Enumeration 名前空間を使用して行われます。

  1. まず、これらの using ステートメントをクラス定義ファイルに追加します。
    using Windows.Devices.Enumeration;
    using Windows.Devices.Scanners;
  1. 次に、スキャナーの列挙を開始するデバイス ウォッチャーを実装します。 詳細については、「 デバイスの追加」を参照してください。
    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;
    }
  1. スキャナーが追加されたときのイベント ハンドラーを作成します。
    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);
             }
       );
    }

スキャン

  1. ImageScanner オブジェクトを取得する

ImageScannerScanSource列挙型について、 DefaultAutoConfiguredFlatbed、または Feeder のいずれであっても、まず次のように ImageScanner.FromIdAsync メソッドを呼び出して、ImageScanner オブジェクトを作成する必要があります。

   ImageScanner myScanner = await ImageScanner.FromIdAsync(deviceId);
  1. スキャンのみ

既定の設定でスキャンするには、アプリは Windows.Devices.Scanners 名前空間に依存してスキャナーを選択し、そのソースからスキャンします。 スキャン設定は変更されません。 可能なスキャナーは、自動構成、フラットベッド、またはフィーダーです。 この種類のスキャンでは、フィーダーの代わりにフラットベッドのように、間違ったソースからスキャンした場合でも、スキャン操作が成功する可能性が最も高くなります。

注: ユーザーがスキャンするドキュメントをフィーダーに置くと、スキャナーは、代わりにフラットベッドからスキャンします。 ユーザーが空のフィーダーからスキャンしようとすると、スキャン ジョブはスキャンされたファイルを生成しません。  

    var result = await myScanner.ScanFilesToFolderAsync(ImageScannerScanSource.Default,
        folder).AsTask(cancellationToken.Token, progress);
  1. 自動構成、フラットベッド、またはフィーダーソースからのスキャン

アプリは、デバイスの Auto-Configured Scanning を使用して、最適なスキャン設定でスキャンできます。 このオプションを使用すると、デバイス自体は、スキャンされるコンテンツに基づいて、カラー モードやスキャン解像度などの最適なスキャン設定を決定できます。 デバイスは、新しいスキャン ジョブごとに実行時にスキャン設定を選択します。

注: すべてのスキャナーがこの機能をサポートしているわけではないため、アプリはこの設定を使用する前に、スキャナーがこの機能をサポートしているかどうかを確認する必要があります。

この例では、アプリは最初にスキャナーが自動構成できるかどうかを確認してからスキャンします。 フラットベッド スキャナーまたはフィーダー スキャナーを指定するには、 AutoConfiguredFlatbed または 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();
    }
}

進行状況でスキャンする

  1. System.Threading.CancellationTokenSource オブジェクトを作成します。
cancellationToken = new CancellationTokenSource();
  1. 進行状況イベント ハンドラーを設定し、スキャンの進行状況を取得します。
    rootPage.NotifyUser("Scanning", NotifyType.StatusMessage);
    var progress = new Progress<UInt32>(ScanProgress);

画像ライブラリへのスキャン

ユーザーは、 FolderPicker クラスを使用して任意のフォルダーを動的にスキャンできますが、ユーザーがそのフォルダーをスキャンできるようにするには、マニフェストで Pictures Library 機能を宣言する必要があります。 アプリの機能の詳細については、「 App 機能宣言」を参照してください。