2016-07-27 13 views
1

私はWPFアプリケーションを開発し、スキャナでさまざまなドキュメントをスキャンします。ドキュメントのサイズは同じではなく、可変にすることができます。WIA:ディナミックページサイズを設定する

私は自分のコードをスキャナのダイアログなしで操作しています。ユーザは画像をプレビューしてから実際のサイズ(2回のスキャン結果)を得るためにスキャンする必要はありません。 0x80210067 System.Runtime.InteropServices.COMException:

問題

は、私は
SetWIAProperty(item.Properties, "3097", 100); 

をスキャンする前に、autoにページサイズを設定しようとするが、私はHRESULTを取得することです。 私はこれを尋ねて、スキャナがこのプロパティをサポートしていないことを確かめました。

これを達成する方法はありますか?私は結果として得られるスキャンされたイメージをドキュメントだけにする必要があります。 スキャナにドキュメントのみをスキャンするように指示できなかった場合は、必要なドキュメントのみを取得するために結果イメージを切り抜くことも考えましたが、今すぐこれを行う方法はわかりません。

   DeviceManager deviceManager = new DeviceManager(); 
       Device scanner = null; 
       foreach (DeviceInfo deviceInfo in deviceManager.DeviceInfos) 
       { 
        if (deviceInfo.DeviceID == scannerId) 
        { 
         scanner = deviceInfo.Connect(); 
         break; 
        } 
       } 

       if (scanner == null) 
       { 
        throw new Exception("Scanner not found"); 
       } 

       Item item = scanner.Items[1] as Item; 
       int dpi = 300; 
       SetWIAProperty(item.Properties, "6146", 1); // 1 Color 
       SetWIAProperty(item.Properties, "6147", dpi); // dpis 
       SetWIAProperty(item.Properties, "6148", dpi); // dpis 
       // This line throws the exception 
       //SetWIAProperty(item.Properties, "3097", 100); // page size 0=A4, 1=letter, 2=custom, 100=auto 

       try 
       { 
        ICommonDialog wiaCommonDialog = new CommonDialog(); 
        ImageFile scannedImage = (ImageFile)wiaCommonDialog.ShowTransfer(item, FormatID.wiaFormatPNG, false); 

        if (scannedImage != null) 
        { 
         ImageProcess imgProcess = new ImageProcess(); 
         object convertFilter = "Convert"; 
         string convertFilterID = imgProcess.FilterInfos.get_Item(ref convertFilter).FilterID; 
         imgProcess.Filters.Add(convertFilterID, 0); 
         SetWIAProperty(imgProcess.Filters[imgProcess.Filters.Count].Properties, "FormatID", FormatID.wiaFormatPNG); 
         scannedImage = imgProcess.Apply(scannedImage); 
         if (System.IO.File.Exists(@"D:\temp\scanwia3.png")) 
          System.IO.File.Delete(@"D:\temp\scanwia3.png"); 
         scannedImage.SaveFile(@"D:\temp\scanwia3.png"); 
        } 
        scannedImage = null; 
       } 
       finally 
       { 
        item = null; 
        scanner = null; 
       } 

そしてSetWIAProperty機能:任意の助けをいただければ幸いです

private static void SetWIAProperty(IProperties properties, object propName, object propValue) 
    { 
     Property prop = properties.get_Item(ref propName); 
     prop.set_Value(ref propValue); 
    } 

は、ここに私のコードです。

親切にして、

ホセ。

答えて

0

プロパティPage Sizeはデバイスに属し、アイテムには属しません。

var WIA_IPS_PAGE_SIZE = "3097"; 
var WIA_PAGE_AUTO = 100; 

SetWIAProperty(scanner.Properties, WIA_IPS_PAGE_SIZE, WIA_PAGE_AUTO); 
+0

私もこれを試しましたが、同じ例外があります。私は最終的にこれを諦め、最終的なアプローチはスキャンのためのプレビューダイアログを表示しています:ユーザーは最初に画像をプレビューしてトリミングし、最終的な画像をスキャンします。御時間ありがとうございます。 –

+0

私はNTwainを使ってスキャンしており、デフォルトでは自動サイズが有効になっています。 – xiety

+0

NTwainはWIAで直接達成できない機能を提供するかもしれません。しかし、残念ながら今NTwainに変更することはできません。 –

関連する問題