アプリからスキャンする

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

重要な API

重要

Windows.Devices.Scanners API は、デスクトップ デバイス ファミリの一部です。 アプリでは、デスクトップ版の Windows 10 でのみこれらの 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 列挙型の各メンバーに対しては、DefaultAutoConfiguredFlatbedFeeder のいずれであれ、最初に 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. 自動構成、フラットベッド、フィーダーのいずれかのソースからスキャンする

デバイスの自動構成スキャンを使うと、最適なスキャン設定でスキャンを実行することができます。 このオプションでは、スキャン対象のコンテンツに応じた最適なスキャン設定 (カラー モード、スキャン解像度など) をデバイスが自動的に判断します。 スキャン設定は、新しいスキャン ジョブの実行時にその都度選択されます。

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

この例では、スキャナーが自動構成に対応しているかどうかをアプリがまずチェックしたうえで、スキャンを実行しています。 フラットベッド スキャナーまたはフィーダー スキャナーを指定する場合は、単に 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 クラスを使うことで、ユーザーは任意のフォルダーにスキャン結果を動的に格納することができます。ただし、画像ライブラリ フォルダーにスキャン結果を格納できるようにするには、画像ライブラリの機能をマニフェストで宣言する必要があります。 アプリの機能の詳細については、「アプリ機能の宣言」を参照してください。