Twain یک API شناخته شده و استاندارد ئه که اسکنر ها ساپورتش می کنند و کار کردن باهاش راحته. یک پکیج دلخواه تون مثلا NTwain رو به پروژه تون در ویژوال استدیو اضافه می کنید و بعد با چند سطر کد لیست اسکنر ها رو میارید یا درخواست اسکن میکنید و وقتی تصویر دریافت شد با یک رخداد متوجه میشید و دریافتش می کنید.
اگه روی سیستم تون اسکنر واقعی ندارید که پروژه رو باهاش تست کنید، یک نسخه اسکنر مجازی رو از اینجا می توانید دانلود کنید :
https://developer.dynamsoft.com/dwt/kb/2659
داخل ویژوال استدیو که پروژه تون رو باز کردید، در منوی ...Tools > NuGet Package Manager > Manage NuGet Packages for Solution در زبانه Browse عنوان NTwain رو جستجو می کنید تا تیک بزنید و Install کنید.
بعد داخل کد پروژه همچین فیلد هایی رو لازم دارید :
public partial class Form1 : Form
{
private static readonly NTwain.Data.TWIdentity TwainAppId = NTwain.Data.TWIdentity.CreateFromAssembly(
NTwain.Data.DataGroups.Image | NTwain.Data.DataGroups.Control, System.Reflection.Assembly.GetEntryAssembly());
private NTwain.TwainSession _session;
public Form1()
{
InitializeComponent();
}
و اینطوری session میسازید و یک اسکنر رو انتخاب می کنید :
private void button1_Click(object sender, EventArgs e)
{
_session = new NTwain.TwainSession(TwainAppId);
_session.Open();
var source = _session.ShowSourceSelector();
source?.Open();
_session.DataTransferred += session_DataTransferred;
}
و اینطوری در اون session باز و با اون اسکنر انتخاب شده عمل اسکن رو انجام میدید (با تنظیمات نمایشی) :
private void button2_Click(object sender, EventArgs e)
{
_session.CurrentSource.Enable(NTwain.SourceEnableM ode.ShowUI, true, this.Handle);
}
یا بی تنظیمات نمایشی :
private void button4_Click(object sender, EventArgs e)
{
_session.CurrentSource.Enable(NTwain.SourceEnableM ode.NoUI, true, this.Handle);
}
و این عمل اسکن تصویر باعث وقوع رخداد DataTransferred میشه :
private void session_DataTransferred(object sender, NTwain.DataTransferredEventArgs e)
{
using (var stream = e.GetNativeImageStream())
{
pictureBox1.BackgroundImage = Image.FromStream(stream);
}
}
و شما می توانید اون stream رو به آرایه ای از بایت ها تبدیل کرده و در بانک اطلاعاتی ذخیره کنید :
private void session_DataTransferred(object sender, NTwain.DataTransferredEventArgs e)
{
using (var memoryStream = new System.IO.MemoryStream())
{
using (var stream = e.GetNativeImageStream())
{
var buffer = new byte[8192];
int length;
while ((length = stream.Read(buffer, 0, buffer.Length)) > 0)
{
memoryStream.Write(buffer, 0, length);
}
var bytes = memoryStream.ToArray();
// Write bytes in database
}
}
}
و هر زمان کار تون با اسکنر تموم شد یادتون نره که session رو ببندید :
private void button3_Click(object sender, EventArgs e)
{
_session.Close();
}