Ich entwickle eine WPF-Anwendung zum Scannen verschiedener Dokumente mit einem Scanner. Die Größe der Dokumente wird nicht gleich sein, kann variabel sein.WIA: Dinamic Seitengröße
Ich habe meinen Code ohne Scanner-Dialoge arbeiten, und ich möchte, dass der Benutzer das Bild nicht in der Vorschau anzeigen und dann scannen muss, um die tatsächliche Größe (in zwei Scans) zu erhalten.
Das Problem ist, dass ich versuche, vor
SetWIAProperty(item.Properties, "3097", 100);
Scannen zum automatischen Seitengröße einstellen, aber ich erhalte HRESULT: 0x80210067 System.Runtime.InteropServices.COMException. Ich habe gegooglet und sieht, dass mein Scanner diese Eigenschaft nicht unterstützt.
Also, gibt es eine Möglichkeit, dies zu erreichen? Ich brauche das resultierende gescannte Bild, um nur das Dokument zu sein, nicht den gesamten Scannerbereich (den ich gerade erhalte). Falls ich den Scanner nicht dazu bringen konnte, nur das Dokument zu scannen, habe ich auch daran gedacht, das resultierende Bild zu beschneiden, um nur das Dokument zu erhalten, das ich brauche, aber ich weiß nicht, wie ich das jetzt machen soll.
Hier ist mein Code:
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;
}
Und SetWIAProperty Funktion:
private static void SetWIAProperty(IProperties properties, object propName, object propValue)
{
Property prop = properties.get_Item(ref propName);
prop.set_Value(ref propValue);
}
Jede Hilfe würde geschätzt.
Mit freundlichen Grüßen,
Jose.
Ich habe mit diesem versucht, aber ich habe die gleiche Ausnahme. Ich gab schließlich damit auf und der letzte Ansatz zeigt einen Vorschaudialog für das Scannen: Die Benutzer sehen das Bild zuerst in der Vorschau und schneiden es dann ab und scannen dann das endgültige Bild. Vielen Dank für Ihre Zeit. –
Ich scanne mit NTwain, und die automatische Größe ist standardmäßig aktiviert. – xiety
Vielleicht NTWain bietet einige Funktionen, die ich nicht direkt mit WIA erreichen kann. Aber leider kann ich momentan nicht zu NTwain wechseln. –