C #: Как избежать WIA-ошибки при сканировании документов с разрешением 2400 точек на дюйм и более? - PullRequest
1 голос
/ 05 мая 2010

при сканировании документа с разрешением 2400 точек на дюйм или выше мы получаем (например) следующее сообщение об ошибке:

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

Может кто-нибудь помочь нам с этой проблемой?

спасибо

1 Ответ

0 голосов
/ 15 мая 2011

Я собираюсь предположить, что вы работаете в формате A4 / 8.5x11 в цвете (32-битный) - это очень близко к 2 гигабайтам для BMP, что близко к пределу 32-битного числа со знаком. Я бы сказал, что это не столько разрешение, сколько общий объем данных. По крайней мере, пределы структур данных COM - это заключение автора приложения для сканирования silverlight . Если вы подумаете об этом, если все это когда-либо появится в буфере для 32-битного процесса, у вас не хватит памяти, пытаясь выделить непрерывный кусок памяти такого большого размера.

Мои знания о WIA немного поблекли, но, если я правильно помню, WIA сканирует через службу, если она 32-разрядная, и вы вызываете ее через COM, отсюда и буфер, и ограничение. Это, и если вы не получите правильные параметры сканирования, он выберет BMP (без сжатия). Кажется, я не могу вспомнить, можете ли вы заставить его делать JPEG для цвета или вы вынуждены проходить конвертер. Если вы хотите работать с такими большими данными, одним из вариантов может быть переключение на API C ++, который позволяет потоковый доступ вместо буферизованного доступа (я никогда не использовал его, но упомянул об этом на случай, если это поможет).

...