5

HP Scanjet 7000(デュプレックスおよびADFスキャナー)とHP Scanjet 5500c(ADFのみ)、およびWindows7でWIA2.0を使用するスキャナープログラムを開発しています。

問題は、コードが古いスキャナーモデルで完全に機能することですが、新しいスキャナーモデルでは、コードは最初のページで問題なく実行され、2番目のページで失敗するようです。次の行の周りのコードをステップスルーすると、

image = (WIA.ImageFile)wiaCommonDialog.ShowTransfer(item, wiaFormatTIFF, false);

古いスキャナーは停止し、同じ参照で別の呼び出しが行われるのを待ちますが、新しいスキャナーは1回の連続操作でフィーダーからすべてのページを実行します。

Windows 7でデフォルトのスキャンプログラムを使用している場合、新しいプログラムはすべての個別のページを含む単一の.tifファイルを返します。古いファイルは、個別の.jpgファイル(ページごとに1つ)を返します。

これは、新しいスキャナーがフィーダー全体をスキャンしてから、画像のコレクションを返す準備ができていることを示しています。古いスキャナーは、スキャンされた各ページの間に1つの画像を返します。

コードでこの動作をサポートするにはどうすればよいですか?以下は、古いスキャナーモデルで機能する関連コードの一部です。

public static List<Image> Scan(string scannerId)
    {
        List<Image> images = new List<Image>();
        List<String> tmp_imageList = new List<String>();

        bool hasMorePages = true;
        bool useAdf = true;
        bool duplex = false;

        int pages = 0;

        string fileName = null;
        string fileName_duplex = null;

        WIA.DeviceManager manager = null;
        WIA.Device device = null;
        WIA.DeviceInfo device_infoHolder = null;
        WIA.Item item = null;
        WIA.ICommonDialog wiaCommonDialog = null;

        manager = new WIA.DeviceManager();

        // select the correct scanner using the provided scannerId parameter
        foreach (WIA.DeviceInfo info in manager.DeviceInfos)
        {
            if (info.DeviceID == scannerId)
            {
                // Find scanner to connect to
                device_infoHolder = info;        
                break;
            }
        }

        while (hasMorePages)
        {
            wiaCommonDialog = new WIA.CommonDialog();              

            // Connect to scanner
            device = device_infoHolder.Connect();

            if (device.Items[1] != null)
            {
                item = device.Items[1] as WIA.Item;

                try
                {
                    if ((useAdf) || (duplex))
                        SetupADF(device, duplex); //Sets the right properties in WIA

                    WIA.ImageFile image = null;
                    WIA.ImageFile image_duplex = null;

                    // scan image                
                    image = (WIA.ImageFile)wiaCommonDialog.ShowTransfer(item, wiaFormatTIFF, false);

                    if (duplex)
                    {
                        image_duplex = (ImageFile)wiaCommonDialog.ShowTransfer(item, wiaFormatPNG, false);
                    }

                    // save (front) image to temp file
                    fileName = Path.GetTempFileName();
                    tmp_imageList.Add(fileName);
                    File.Delete(fileName);
                    image.SaveFile(fileName);
                    image = null;               

                    // add file to images list
                    images.Add(Image.FromFile(fileName));

                    if (duplex)
                    {
                        fileName_duplex = Path.GetTempFileName();
                        tmp_imageList.Add(fileName_duplex);
                        File.Delete(fileName_duplex);
                        image_duplex.SaveFile(fileName_duplex);
                        image_duplex = null;

                        // add file_duplex to images list
                        images.Add(Image.FromFile(fileName_duplex));
                    }

                    if (useAdf || duplex)
                    {
                        hasMorePages = HasMorePages(device); //Returns true if the feeder has more pages
                        pages++;                         
                    }
                }
                catch (Exception exc)
                {
                    throw exc;
                }
                finally
                {
                    wiaCommonDialog = null;
                    manager = null;
                    item = null;
                    device = null;
                }
            }
        }
        device = null;
        return images;
    }

この問題に関する助けをいただければ幸いです。Web上で実用的な解決策を見つけることができないようです。同じ問題を抱えている人々からの未回答のフォーラム投稿。

4

3 に答える 3

1

非常によく似た問題があり、特定のプロパティを設定するなどのさまざまな解決策は役に立ちませんでした。主な問題は、プログラムコードで何が起こっているかに関係なく、スキャナー(ADF)が起動時にすべてのページをリトラクトすることでした。次のページがスキャンされる前に「多すぎる」が行われたため、このプロセスは繰り返しエラーを引き起こしました。これは特に、別の「接続」が試行されたという事実に当てはまります。このため、個々のページをできるだけ早く読み込むことができるようにコードを変更しました。

public List<Image> Scan(string deviceID)
    {
        List<Image> images = new List<Image>();

        WIA.ICommonDialog wiaCommonDialog = new WIA.CommonDialog();
        WIA.Device device = this.Connect(deviceID);
        if (device == null)
            return images;

        WIA.Item item = device.Items[1] as WIA.Item;

        List<WIA.ImageFile> wiaImages = new List<ImageFile>();
        try
        {
            // scan images
            do
            {
                WIA.ImageFile image = (WIA.ImageFile)wiaCommonDialog.ShowTransfer(item, wiaFormatJPEG, false);
                wiaImages.Add(image);
            } while (true);
        }
        catch (System.Runtime.InteropServices.COMException ex)
        {
            if ((uint)ex.ErrorCode != WIA_PROPERTIES.WIA_ERROR_PAPER_EMPTY)
                throw ex;
        }
        catch (Exception ex)
        {
            throw ex;
        }

        foreach (WIA.ImageFile image in wiaImages)
            this.DoImage(images, image);

        return images;
    }
于 2018-06-05T13:15:49.497 に答える
0

表示されていないSetupADFというメソッドを呼び出しているようですが、これはおそらくデバイスオブジェクトにいくつかのプロパティを設定します。WIA_DPS_PAGES(プロパティ3096)および/またはWIA_DPS_SCAN_AHEAD_PAGES(プロパティ3094)を設定してみましたか?

SilverlightのADFからのスキャンに関するブログ投稿がありますが、コメント投稿者があなたが抱えているのと同じ問題に直面したと思います。WIA_DPS_PAGESを1に設定すると、彼のために修正されました。コードのSetDevicePropertiesメソッドを変更して、WIA_DPS_PAGESを1に設定し、WIA_DPS_SCAN_AHEAD_PAGESを0に設定することになりました。

于 2012-07-06T21:48:18.683 に答える
0

試行錯誤の末、よくわからない理由でうまくいく解決策に出くわしました。スキャン中にShowTransfer()メソッドがページを.pngまたは.tiffに変換できなかったようです。フォーマットをJPEGまたはBMPに設定すると、実際に問題が解決しました。

image = (ImageFile)scanDialog.ShowTransfer(item, wiaFormatJPEG, false);

Webのどこかで、指定された形式に関係なく、このメソッドが実際にBMPを返すことを確認したと思います。bmpやjpegを使用するのとは対照的に、画像をpngまたはtiffに変換するのは重すぎる可能性があります。

ちなみに、プロパティ設定を3088から0x005(adf ANDデュプレックスモード)に設定しています。

于 2012-09-27T09:13:30.653 に答える