带自动文档传送器(ADF)的C#WIA仅在某些扫描仪上重新调整一页

Tho*_*røm 5 wia image scanning

我有一台HP Scanjet 7000(双面和ADF扫描仪)和一台HP Scanjet 5500c(仅限ADF)以及我正在开发的扫描仪程序,该程序在Windows 7上使用WIA 2.0.

问题是代码在较旧的扫描仪模型上完美运行,但在较新的代码上,代码似乎在第一页运行得很好,然后在第二页上运行失败.如果我绕过以下行的代码;

image = (WIA.ImageFile)wiaCommonDialog.ShowTransfer(item, wiaFormatTIFF, false);
Run Code Online (Sandbox Code Playgroud)

旧扫描仪停止并等待在同一参考上进行另一次调用,但是较新的扫描仪只能在一次连续操作中从进纸器运行所有页面.

我注意到如果我在Windows 7中使用默认扫描程序,则较新的一个会返回一个包含所有单独页面的.tif文件.较旧的文件返回单独的.jpg文件(每页一个).

这向我表明,较新的扫描仪在准备好返回图像集之前扫描其整个进纸器,其中较旧的扫描仪在每个扫描的页面之间返回一个图像.

我如何在代码中支持这种行为?以下是适用于旧扫描仪型号的相关代码的一部分:

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;
    }
Run Code Online (Sandbox Code Playgroud)

对此问题的任何帮助将非常感谢!我似乎无法在网上找到一个可行的解决方案.来自具有相同问题的人的未答复的论坛帖子.

Tho*_*røm 0

经过大量的试验和错误后,我偶然发现了一个解决方案,该解决方案由于我不太确定的原因而有效。扫描时 ShowTransfer() 方法似乎无法将页面转换为 .png 或 .tiff。将格式设置为 JPEG 或 BMP 实际上解决了我的问题:

image = (ImageFile)scanDialog.ShowTransfer(item, wiaFormatJPEG, false);
Run Code Online (Sandbox Code Playgroud)

我想我在网络上的某个地方看到这个方法实际上返回 BMP,无论指定的格式如何。与使用 bmp 或 jpeg 相比,将图像转换为 png 或 tiff 可能太繁重。

顺便说一句,我正在设置属性设置:3088 至 0x005(adf AND 双工模式)。