C#WIA与自动文档进纸器(ADF)retuns对某些扫描仪只有一个页面(C# WIA with A

2019-06-26 01:17发布

我有一台HP Scanjet扫描7000(双面自动进稿器和扫描器)和HP Scanjet扫描550℃(仅ADF)和我正在开发一个扫描程序,它在Windows 7使用WIA 2.0。

问题是,在代码完美的作品上了年纪的扫描仪型号,但较新的一个代码似乎通过第一页跑就好了,再不行就第二。 如果我步骤通过围绕下面的行的代码;

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

另一个呼叫旧扫描仪停止,等待在相同的制造,但较新的一个刚刚经历它的所有的网页在一个连续的操作从给料机运行。

我发现如果我使用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;
    }

在这个问题上的任何帮助将是非常非常感谢! 我似乎无法在网上找到一个工作的解决方案。 从人同样的问题时只需解答论坛帖子。

Answer 1:

我看到你调用一个名为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。



Answer 2:

试错的很多之后,我偶然发现了它的工作的原因,我不是很确定的解决方案。 这似乎是ShowTransfer()方法无法将页面png格式或.TIFF WHILE扫描转换。 设置格式为JPEG或BMP实际上解决这个问题对我来说:

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

我想,我什么地方看到过这种方法实际上返回BMP不管指定的格式在网络上。 可能是,图像转换为PNG或TIFF是太重而不是使用BMP或JPEG。

在阿里纳斯,我设置的属性设置:3088至0x005(ADF和双工模式)。



Answer 3:

我们有一个非常类似的问题和各种解决方案,例如,通过设置一定的属性,并没有帮助。 主要的问题是,扫描仪(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;
    }


文章来源: C# WIA with Automatic Document Feeder (ADF) retuns only one page on certain scanners