1

当我们扫描分辨率为 2400dpi 或更高的文档时,我们会收到(例如)以下错误消息:

COMException: Ausnahme von HRESULT: 0x80010100 (RPC_E_SYS_CALL_FAILED)

或者

COMException:Ausnahme von HRESULT:0x8021006F

在以下行之一中

            img = itm.Transfer(scanFormat.ScanFormat) as WIA.ImageFile;
            img = ip.Apply(img as WIA.ImageFile);

提到的错误的一些屏幕截图:

http://www.amarant-it.de/TempDownload/WIA_Error01.png

或与 WIA_Error02.png 和 WIA_Error03.png 相同的路径

对于扫描,我们使用以下代码:

            #region Image-Convert-Settings
            //IP.Filters.Add IP.FilterInfos("Convert").FilterID
            //IP.Filters(1).Properties("FormatID").Value = wiaFormatJPEG
            WIA.IImageProcess ip = new WIA.ImageProcessClass();
            object convert = "Convert";
            WIA.IFilterInfo fi = ip.FilterInfos.get_Item(ref convert);
            ip.Filters.Add(fi.FilterID, 0);
            convert = "FormatID";
            object formatstring = scanFormat.ScanFormat;
            WIA.IFilter filter;
            foreach (WIA.IFilter fTemp in ip.Filters)
            {
                filter = fTemp;
                WIA.IProperty prop = filter.Properties.get_Item(ref convert);
                prop.set_Value(ref formatstring);
            }
            #endregion
            #region Image-Scan + Convert
            img = itm.Transfer(scanFormat.ScanFormat) as WIA.ImageFile;
            img = ip.Apply(img as WIA.ImageFile);
            img.SaveFile("D:\\scan2." + img.FileExtension);
            Image image = Image.FromFile("D:\\scan2." + img.FileExtension);
            ilImages.Images.Add(image.ToString(), image);
            alImages.Add(image);
            if (ImageScanned != null)
            {
                ImageScanned(image);
            }
            #endregion

谁能帮助我们解决这个问题?

谢谢

4

1 回答 1

0

我猜你正在做 A4/8.5x11 彩色(32 位) - 这非常接近 BMP 的 2 gig,接近 32 位有符号数的限制。我想说这不是分辨率,而是总数据大小。至少 COM 数据结构的限制是silverlight 扫描应用程序的作者的结论。如果您考虑一下,如果它全部显示在 32 位进程的缓冲区中,那么您将在尝试分配这么大的连续内存块时耗尽内存。

我对 WIA 的了解有些退步,但如果我没记错的话,WIA 会通过服务进行扫描,如果它是 32 位的并且您通过 COM 调用它,那么这就是缓冲区和限制的来源。如果你没有得到恰到好处的扫描参数,它会选择 BMP(无压缩)。我似乎不记得你是否可以让它为颜色做 JPEG,或者你是否被迫通过转换器。如果你想处理这么大的数据,一个选项可能是切换到 C++ api,它允许流式访问而不是缓冲访问(我从未使用过它,但我提到它以防万一它有帮助)。

于 2011-05-15T15:20:58.007 回答