Я разрабатываю приложение WPF для сканирования различных документов со сканера. Размер документов не будет одинаковым, может быть переменным.WIA: настройка динамического размера страницы
У меня есть мой код, работающий без диалогов сканера, и я бы хотел, чтобы пользователь не должен был просматривать изображение, а затем сканировать его, чтобы получить реальный размер (в результате получилось два сканирования).
Проблема заключается в том, что я пытаюсь установить страницу размера на авто перед сканированием
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);
}
Любая помощь будет оценена.
С уважением,
Jose.
Я пробовал с этим, но у меня такое же исключение. Я, наконец, отказался от этого, и окончательный подход показывает диалог предварительного просмотра для сканирования: сначала пользователь просматривает и обрезает изображение, а затем просматривает окончательное изображение. Спасибо за ваше время. –
Я сканирую с использованием NTwain, и по умолчанию он имеет автоматический размер. – xiety
Возможно, NTwain предоставляет некоторые возможности, которые я не могу достичь напрямую с WIA. Но, к сожалению, я не могу сейчас переходить на NTwain. –