PDA

View Full Version : سوال: اسکن عکس در سی شارپ



ELI994
شنبه 14 دی 1398, 11:21 صبح
سلام و خسته نباشید
من یه پروژه دارم که توی بخشی از اون میخوام یه تصویر رو از طریق اسکنر اسکن کرده و در دیتابیس ذخیره کنم ممنون میشم راهنمایی بفرمائید

the king
شنبه 14 دی 1398, 15:49 عصر
سلام و خسته نباشید
من یه پروژه دارم که توی بخشی از اون میخوام یه تصویر رو از طریق اسکنر اسکن کرده و در دیتابیس ذخیره کنم ممنون میشم راهنمایی بفرمائید

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();
}

ELI994
یک شنبه 15 دی 1398, 07:47 صبح
سلام ممنون از پاسخگوییتون . فقط میشه بفرمایید api NTwain رو از کجا دانلود کنم لطفا یه لینک که بشه ازش دانلود کرد رو بدین ممنون

رامین مرادی
یک شنبه 15 دی 1398, 08:22 صبح
ممنون میشم بفرمایید لایسنسش چیه؟

the king
یک شنبه 15 دی 1398, 14:52 عصر
سلام ممنون از پاسخگوییتون . فقط میشه بفرمایید api NTwain رو از کجا دانلود کنم لطفا یه لینک که بشه ازش دانلود کرد رو بدین ممنون

بهتر بود از داخل همون ویژوال استدیو با NuGet که توضیح دادم اینکار رو انجام بدید، نه اینکه مستقیم دانلودش کنید.

https://github.com/soukoku/ntwain



ممنون میشم بفرمایید لایسنسش چیه؟

MIT License

https://raw.githubusercontent.com/soukoku/ntwain/v3/LICENSE.txt

پروانه ام‌آی‌تی (https://fa.wikipedia.org/wiki/%D9%BE%D8%B1%D9%88%D8%A7%D9%86%D9%87_%D8%A7%D9%85% E2%80%8C%D8%A2%DB%8C%E2%80%8C%D8%AA%DB%8C)

ELI994
دوشنبه 16 دی 1398, 07:11 صبح
151220سلام من توی tools اون گزینه رو نداشتم بخاطر همون خواستم دانلود کنم

رامین مرادی
دوشنبه 16 دی 1398, 08:23 صبح
اون گزینه که فرمودن تو قسمت tools->library pakage manager هست

Apache66
یک شنبه 01 آبان 1401, 20:19 عصر
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();
}



چطوری میشه کیفیت عکس جهت اسکن مشخص کنیم؟