我正在开展一个项目,该文档将包含许多图像的文档存档为文件或扫描图像,直到其中一个客户决定以高质量和彩色扫描图像为止。 现在应用程序以内存不足错误退出,并且当我监视计算机资源时,我发现它使用了如此多的内存,高达1.4 gig的情况。然后我使用/ LARGEADDRESSAWARE让它尽可能多地使用它,现在如果需要它会使用所有ram内存,这会再次导致内存不足错误。 问题是当我使用扫描仪默认应用程序(Avision)时,它使用的RAM少于400 MB并成功完成所有扫描。
我正在使用Saraff.Twain来处理扫描仪,我已经编写了自己的类来处理Saraff.Twain事件,如下所示:
using Tools;
using System;
using Saraff.Twain;
using System.Drawing.Imaging;
using System.Collections.Generic;
using System.Runtime.InteropServices;
namespace Notary
{
public class ScannerHandler
{
static Twain32 twain = new Twain32();
public static event ScannerEventHandler ScannerEvent;
public delegate void ScannerEventHandler(object sender, List<string> pathes);
[DllImport("gdi32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
internal static extern bool DeleteObject(IntPtr value);
public ScannerHandler()
{
try
{
twain.OpenDSM();
}
catch (Exception e)
{
Accessories.ErrorHandler(e, true);
}
twain.ShowUI = true;
twain.AcquireCompleted += AcquireCompleted;
}
private static void AcquireCompleted(object sender, EventArgs e)
{
try
{
if (ScannerEvent != null)
{
List<string> output = new List<string>();
for (int i = 0; i < twain.ImageCount; i++)
{
string temp = Accessories.GenerateTempAddress("jpg");
twain.GetImage(i).Save(temp, ImageFormat.Jpeg);
output.Add(temp);
}
ScannerEvent.Invoke(sender, output);
}
}
catch (Exception ex)
{
Accessories.ErrorHandler(ex, true);
}
}
public static void Acquire()
{
try
{
twain.Acquire();
}
catch (Exception e)
{
Accessories.ErrorHandler(e, true);
}
}
~ScannerHandler()
{
try
{
twain.Dispose();
}
catch (Exception e)
{
Accessories.ErrorHandler(e, true);
}
}
}
}
扫描程序完成时发生错误,所以我认为问题出在saraff.dll如何工作,或者我做错了什么?有没有办法一个一个地获取图像? 我应该使用任何其他dll扫描仪来更好地管理内存吗?