PDA

View Full Version : حرفه ای: کار با اسکنر



navidiran
دوشنبه 05 اردیبهشت 1390, 12:14 عصر
سلام دوستان. من همه سایتها رو گشتم و مطالبی راجع به موضوع بالا پیدا کردم که اینجا میخوام کمکم کنید جمع بندی کنم.
من هیچ پیش زمینه درباره کار با اسکنر نداشتم و فکر میکردم میتونم خودم کدی برای کار مستقیم با اسکنر تهیه کنم و مدارک یا عکسها رو توسط برنامه خودم از اسکنر بخونم اما الان میبینم اینطور نیست.
اینطور که من فهمیدم:
- برای کار با اسکنر از دو یا سه کامپوننت آماده استفاده میکنیم (بدلیل اینکه اسکنرها از درایورهای مشخصی استفاده میکنند) !! ؟؟
- نمونه این کامپوننتها با نام های twain و Acquisition هستن که یکی از درایورهای مایکروسافت و دیگری نمیدونم کجا!
- من باید این درایورها رو به پروژه خودم اضافه کنم و کمی باهاشون کار کنم تا جواب گیرم؟

دوستان توی تمام تاپیکها یک لینک گذاشته شده به یک مطلب و چیز دیگری نمیشه فهمید. از این مطالب میتونید راهنماییم کنید که ایا من مطلب رو درست گرفتم یا در اشتباهم و ممنون میشم اگر راهنماییم کنید.

در ضمن راهی نیست خودم کامپوننت رو بنویسم؟ چون از کد این کامپوننت ها نمیشه سر درآورد.

HOJAT1
دوشنبه 05 اردیبهشت 1390, 13:57 عصر
try

{


string StrPath = System.IO.Directory.GetCurrentDirectory() + "\\Images";

WIA.
CommonDialog wiaDlg;

WIA.
Device wiaDevice;

WIA.
DeviceManager wiaManager = new DeviceManager();

wiaDlg =
new WIA.CommonDialog();

wiaDevice = wiaDlg.ShowSelectDevice(
WiaDeviceType.ScannerDeviceType, false, false);


foreach (WIA.Item item in wiaDevice.Items)

{


StringBuilder propsbuilder = new StringBuilder();


foreach (WIA.Property itemProperty in item.Properties)

{


IProperty tempProperty; Object tempNewProperty;


if (itemProperty.Name.Equals("Horizontal Resolution"))

{

tempNewProperty = 75; ((
IProperty)itemProperty).set_Value(ref tempNewProperty);

}


else


if (itemProperty.Name.Equals("Vertical Resolution"))

{

tempNewProperty = 75; ((
IProperty)itemProperty).set_Value(ref tempNewProperty);

}


else


if (itemProperty.Name.Equals("Horizontal Extent"))

{

tempNewProperty = 619;

((
IProperty)itemProperty).set_Value(ref tempNewProperty);

}


else if (itemProperty.Name.Equals("Vertical Extent"))

{

tempNewProperty = 876;

((
IProperty)itemProperty).set_Value(ref tempNewProperty);

}

}


try

{


for (int i = 0; ; i++)

{




ImageFile image = (ImageFile)item.Transfer(WIA.FormatID.wiaFormatJPE G);



image.SaveFile(
frmMain.pathInitial + "\\Images\\pic" + i + ".jpg");





}

}


catch

{


return;

}

}

}


catch

{


MessageBox.Show(" ");


return;

}

علیرضا حسن زاده
دوشنبه 05 اردیبهشت 1390, 15:01 عصر
توجه داشته باشید که در ویندوز 7 نمی تونید از Wia 1.0 استفاده کنید(کد بالا برایWia 1.0 هست)
از Wia 2.0 استفاده کند که برای 7 هست و با نصبش تو XP هم می تونی استفاده کنی کد کمتری هم نیاز داره

exlord
دوشنبه 05 اردیبهشت 1390, 15:07 عصر
Microsoft Windows Image Acquisition Library v2.0
const string wiaFormatJPEG = "{B96B3CAE-0728-11D3-9D7B-0000F81EF32E}";
CommonDialogClass wiaDiag = new CommonDialogClass();
WIA.ImageFile wiaImage = null;

wiaImage = wiaDiag.ShowAcquireImage(
WiaDeviceType.UnspecifiedDeviceType,
WiaImageIntent.GrayscaleIntent,
WiaImageBias.MaximizeQuality,
wiaFormatJPEG, true, true, false);

WIA.Vector vector = wiaImage.FileData;
Image i = Image.FromStream(new MemoryStream((byte[])vector.get_BinaryData()));

navidiran
دوشنبه 05 اردیبهشت 1390, 15:08 عصر
توجه داشته باشید که در ویندوز 7 نمی تونید از Wia 1.0 استفاده کنید(کد بالا برایWia 1.0 هست)
از Wia 2.0 استفاده کند که برای 7 هست و با نصبش تو XP هم می تونی استفاده کنی کد کمتری هم نیاز داره

متاسفانه من هنوز مفهوم Wia رو نگرفتم چه برسه به 1 یا 2 بودنش.
دوستان اگه نخوام از کدهای Wia استفاده کنم چیکار کنم. مشکلم اینه.

navidiran
دوشنبه 05 اردیبهشت 1390, 16:40 عصر
یافتم. دوستان کافی بود یکی لطف کنه و بگه: در قسمت Add refrence گزینه Microsoft windows image Aquisition رو به پروژه اضافه باید کرد.!!!!!!!!!!!!!!!!!!!

sia_2007
دوشنبه 05 اردیبهشت 1390, 20:01 عصر
دوست عزیز؛ برای راحتی کار مراحل زیر انجام شده
تمامی سازندگان اسکنر برای ویندوز ؛ درایور ارائه کرده اند
ویندوز با یک فایل COM ؛ قابلیت استفاده از اسکنر را بدون توجه به نوع درایور فراهم کرده و از این طریق کار رو خیلی آسون کرده
این در مورد تمومی دستگاه ها صدق میکنه؛ مثلا سازندگان کارت گرافیک ؛ درایور ارائه میدهند؛ علاوه بر این یک درایور استاندارد نیز وجود دارد که البته محدود است
سپس Direct X یا Open GL میآیند و یک لایبراری در اختیار شما قرار میدن که شما با استفاده از اون لایبراری ها؛ میتونید با یک کد با تمومی کارت های گرافیکی که قدرت کافی دارن کار کنین؛ در واقع طی این فرآیند نوع کارت گرافیک یا اسکنر از شما مخفی میشه و کارتون خیلی ساده میشه
حالا براتون واضحه که اگه شما بخواین فایل COM ای ارائه بدین که با تمومی اسکنر ها سازگار باشه؛ کار بسیار سختی هستش
حالا میرسیم به بحث شیرین Net. ؛
Net. اگه بخش CLR و CIL و کلی امکان خوب دیگش رو فاکتور بگیریم که ربطی به این بحث ما ندارن؛ یک مفهومی داره که طی اون فایل های COM ویندوز رو در قالب کدهای Managed شده در اختیار شما قرار میده
برای مثال ؛ System.Data.SqlClient ؛ یک سری فایل COM هستش که شما خودتون هم میتونید مستقیم باشون کار کنید
اما مزیت Net. چیه ؟
علاوه بر آسونی بیش از اندازه تو استفاده؛ شما این اطمینان رو دارین که اگه مثلا از Net. نسخه 2 استفاده کردین؛ کدتون حتما تو انواع ویندوزها کار میکنه و این تضمین توسعه دهنده های Net. هستش.
و اگه یه روز تحت یه روش استاندارد؛ این پلتفرم به لینوکس منتقل بشه که داره میشه؛ شما این اطمینان رو دارین که کدتون اونجا هم کار میکنه
لکن این که شما یه COM رو فراخونی کنید؛ ( مثلا در قضیه اسکنر )؛ هیچ تضمینی نیست که اون تو همه ی ویندوز ها درست کار کنه
چه برسه به لینوکس !
حال تو خود بخوان این نمیدونم چی چی رو