【发布时间】:2018-09-09 14:26:57
【问题描述】:
我正在尝试使用 NTwain 库从 C# 与兼容 TWAIN 的多功能打印机和扫描仪、Canon Pixma MG5750 进行交互。我正在编写一个程序来将图像扫描到Image 对象中。
扫描仪在扫描图像之前必须预热;这样做时它会显示以下弹出窗口:
此过程完成后,它将开始扫描文档。
虽然该程序确实有效,但问题是这个预热过程有时会无缘无故地花费很长时间,最多几分钟。使用佳能自己的应用程序 IJ Scan Utility 时不会出现此问题,该应用程序使用 TWAIN 并显示相同的对话框,但仅显示几秒钟。
我可以使用 TWAIN 功能来提高此预热过程的速度吗?我试过更改ICapXResolution 和ICapYResolution,但这些只会提高热身后实际扫描的速度,不会影响热身本身。
我的程序如下所示。请注意,它是一个控制台应用程序,因此使用 ThreadPool。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using NTwain;
using NTwain.Data;
using System.Drawing;
using System.Threading;
namespace TwainExample
{
class Program
{
[STAThread]
static void Main(string[] args)
{
ThreadPool.QueueUserWorkItem(o => TwainWork());
Console.ReadLine();
}
static void TwainWork()
{
var identity = TWIdentity.CreateFromAssembly(DataGroups.Image, Assembly.GetEntryAssembly());
var twain = new TwainSession(identity);
twain.Open();
twain.DataTransferred += (s, e) =>
{
var stream = e.GetNativeImageStream();
var image = Image.FromStream(stream);
// Do things with the image...
};
var source = twain.First();
Console.WriteLine($"Scanning from {source.Name}...");
var openCode = source.Open();
Console.WriteLine($"Open: {openCode}");
source.Enable(SourceEnableMode.NoUI, false, IntPtr.Zero);
}
}
}
它输出:
Scanning from Canon MG5700 series Network...
Open: Success
【问题讨论】:
-
鉴于 Main() 具有 [STAThread] 属性,似乎对代码中的问题有所了解。那么当你不使用线程池线程时会发生什么?
-
我更新的示例对您有用吗?
-
@FredKleuver 很抱歉没有回复,我已经离开了。我实际上无法编译它;那里似乎有一些 C# 错误。我回来后会尝试调整它,但我目前无法访问我的扫描仪来实际测试它。
-
啊,是的,抱歉,由于我不记得的原因,我在答案中而不是在我的解决方案中的另一个文件中编辑它。 SO 不是一个很好的类型检查器 :) 我更新了我现在应该编译的答案。