WIA:设置动态页面大小

Posted

技术标签:

【中文标题】WIA:设置动态页面大小【英文标题】:WIA: setting dinamic page size 【发布时间】:2016-12-01 17:49:36 【问题描述】:

我正在开发一个 WPF 应用程序来使用扫描仪扫描不同的文档。文件大小不一样,可以变化。

我的代码在没有扫描仪对话框的情况下工作,我希望用户不必预览图像然后扫描它以获得实际尺寸(导致两次扫描)。

问题是我尝试在扫描前将页面大小设置为自动

SetWIAProperty(item.Properties, "3097", 100);

但我得到 HRESULT: 0x80210067 System.Runtime.InteropServices.COMException。 我用谷歌搜索了这个,发现我的扫描仪不支持这个属性。

那么,有没有什么办法可以实现呢?我需要生成的扫描图像只是文档,而不是所有扫描仪区域(我现在正在获取)。 万一我不能告诉扫描仪只扫描文档,我也想过裁剪生成的图像以仅获取我需要的文档,但现在不知道该怎么做。

这是我的代码:

                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);
    

任何帮助将不胜感激。

亲切的问候,

何塞。

【问题讨论】:

【参考方案1】:

属性Page Size属于设备,不属于项目。

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

SetWIAProperty(scanner.Properties, WIA_IPS_PAGE_SIZE, WIA_PAGE_AUTO);

【讨论】:

我试过这个,但我有同样的例外。我终于放弃了,最后的方法是显示一个预览对话框进行扫描:用户首先预览并裁剪图像,然后扫描最终图像。感谢您的宝贵时间。 我正在使用 NTwain 进行扫描,它默认启用了自动大小。 也许 NTwain 提供了一些我无法通过 WIA 直接实现的功能。但不幸的是,我现在无法更改为 NTwain。

以上是关于WIA:设置动态页面大小的主要内容,如果未能解决你的问题,请参考以下文章

使用 C# 和 WIA 进行扫描

H5页面中字体大小动态配置

html动态设置根字体大小(页面字体使用rem单位可根据屏幕大小自适应)

动态设置移动页面字体大小技术方案

前端-根据页面大小动态计算字体大小

反应表动态页面大小,但有大小限制和分页