スキャナーを使ってスキャンするには

スキャナーを取得する

WindowsRuntimeではイメージスキャナーを標準でサポートしています。

使用するスキャナーを決定するためにはDeviceInformationクラスのFindAllAsyncでDeviceClass列挙体のImageScannerを渡してスキャナーを列挙します。

 

コレクションからどのスキャナーを使うかを決定し、そのIdをImageScannerクラスのFromIdAsyncメソッドに渡してImageScannerを初期化します。

ImageScanner scanner;

 

DeviceInformationCollection collection = await DeviceInformation.FindAllAsync(DeviceClass.ImageScanner);
DeviceInformation info = collection.First();//今回は1番目のスキャナーを使う
string printerName = info.Name;

scanner = await ImageScanner.FromIdAsync(info.Id);

DeviceClassを使いましたがImageScannerのGetDeviceSelectorをFindAllAsyncメソッドにわたすことでフィルタリングも可能です。

DeviceInformationCollection collection = await DeviceInformation.FindAllAsync(ImageScanner.GetDeviceSelector());

 

スキャンしてStorageFileに保存する

スキャナーが決定できたらScanFileToStorageFolderAsyncメソッドによってスキャンを開始することができます。

今回は画像ライブラリに保存するのでマニフェストファイルの機能→画像ライブラリにチェックを入れましょう。

StorageFolder folder =KnownFolders.PicturesLibrary;
await scanner.ScanFilesToFolderAsync(scanner.DefaultScanSource,folder);

 

スキャンしてプレビューする

プレビュー機能のあるスキャナーならばスキャン結果をプレビューすることが可能です。

IsPreviewSupportedメソッドをつかって、プレビュー機能をスキャナーがサポートするかを判断し、

ScanPreviewToStreamAsyncメソッドつかってストリームにプレビューデータを流します。

あとはInMemoryRandomAccessStreamをつかってImageコントロールにストリームを流します。

if (scanner.IsPreviewSupported(scanner.DefaultScanSource)) 
{
    BitmapImage image=new BitmapImage();
    using (InMemoryRandomAccessStream stream = new InMemoryRandomAccessStream())
    {
        await scanner.ScanPreviewToStreamAsync(scanner.DefaultScanSource, stream);
       
        await image.SetSourceAsync(stream);
    }
    
    img_preview.Source = image;

}

 

サンプルコード

XAML

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
    <Button x:Name="btn_scan" Content="ScanPreview" HorizontalAlignment="Left" Margin="249,209,0,0" VerticalAlignment="Top" Click="btn_scan_Click"/>
    <Image x:Name="img_preview" HorizontalAlignment="Left" Height="222" Margin="490,153,0,0" VerticalAlignment="Top" Width="243"/>
    <Button x:Name="btn_scanToFile" Content="ScanToFile" HorizontalAlignment="Left" Margin="252,287,0,0" VerticalAlignment="Top" Click="btn_scanToFile_Click"/>
    <Button x:Name="btn_findScanner" Content="FindScannner" HorizontalAlignment="Left" Margin="252,102,0,0" VerticalAlignment="Top" Click="btn_findScanner_Click"/>

</Grid>

C#

public sealed partial class MainPage : Page
{
    ImageScanner scanner;
    public MainPage()
    {
        this.InitializeComponent();
    }

    private async void btn_scan_Click(object sender, RoutedEventArgs e)
    {
        
        if (scanner.IsPreviewSupported(scanner.DefaultScanSource)) 
        {
            BitmapImage image=new BitmapImage();
            using (InMemoryRandomAccessStream stream = new InMemoryRandomAccessStream())
            {
                await scanner.ScanPreviewToStreamAsync(scanner.DefaultScanSource, stream);
               
                await image.SetSourceAsync(stream);
            }
            
            img_preview.Source = image;

        }
    }

    private async void btn_scanToFile_Click(object sender, RoutedEventArgs e)
    {
        StorageFolder folder =KnownFolders.PicturesLibrary;
        await scanner.ScanFilesToFolderAsync(scanner.DefaultScanSource,folder);

        
    }

    private async void btn_findScanner_Click(object sender, RoutedEventArgs e)
    {
        DeviceInformationCollection collection = await DeviceInformation.FindAllAsync(ImageScanner.GetDeviceSelector());
        DeviceInformation info = collection.First();
        string printerName = info.Name;
        
        scanner = await ImageScanner.FromIdAsync(info.Id);
    }

    
}

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください