[DELPHI] ควบคุมเครื่องสแกนใน Delphi
---- เมื่อใช้ Delphi ในการพัฒนาระบบการจัดการข้อมูล รูปภาพมักจะได้รับการประมวลผล ซึ่งเป็นแนวโน้มที่หลีกเลี่ยงไม่ได้ในการพัฒนาระบบการจัดการข้อมูล จะรับข้อมูลภาพที่ต้องการผ่านเครื่องสแกนใน Delphi ได้อย่างไร มีวิธีการพื้นฐานไม่เกินสามวิธี:
ด้วยซอฟต์แวร์ประมวลผลภาพ เช่น Photoshop ฯลฯ ด้วยฟังก์ชันการสแกนภาพ ทำให้สามารถประมวลผลเป็นภาพในรูปแบบที่กำหนดแล้วนำไปใช้ในระบบของคุณเองได้
ผ่านอินเทอร์เฟซสแกนเนอร์ Twain.DLL อินเทอร์เฟซนี้มีให้เมื่อติดตั้งเครื่องสแกน จริงๆ แล้วเป็นปลั๊กอินที่ควบคุมเครื่องสแกนผ่านชุดฟังก์ชันต่างๆ
ควบคุมเครื่องสแกนผ่านเทคโนโลยีส่วนประกอบ
---- การใช้วิธีแรกสามารถลดความซับซ้อนของการเขียนโปรแกรมได้ แต่การรวมระบบไม่สูงและไม่สะดวกสำหรับผู้ใช้ วิธีที่สองสามารถควบคุมสแกนเนอร์ได้โดยตรงที่ระดับไดรเวอร์ซึ่งสามารถทำได้
ให้ความยืดหยุ่นและการควบคุมสูงสุดในการเขียนโปรแกรม วิธีที่สามสามารถใช้ประโยชน์จากเทคโนโลยีส่วนประกอบภาพของ Delphi ได้อย่างเต็มที่เพื่อใช้สแกนเนอร์อย่างปลอดภัย ยืดหยุ่น และอิสระ จริงๆ แล้ววิธีที่ 3 ก็คือ
มันถูกสร้างขึ้นบนอินเทอร์เฟซสแกนเนอร์ Twain.DLL วิธีที่กล่าวถึงในบทความนี้ใช้วิธีที่สาม
---- Windows9X มีตัวเลือก "รูปภาพ" ในไฟล์แนบ ซึ่งใช้ส่วนประกอบ OCX เพื่อควบคุมสแกนเนอร์ มี imgEdit, imgAnntool, imgScan และ imgAdmin สี่ส่วน โดยพื้นฐานแล้วสามารถควบคุมสแกนเนอร์ได้เต็มรูปแบบ การใช้งานใน Delphi มีดังนี้: เลือก "รูปภาพ" การติดตั้งใน Windows9x (เลือก "เพิ่ม/ลบโปรแกรม" ในแผงควบคุม จากนั้นเลือก "ติดตั้ง Windows" คลิกช่องทำเครื่องหมาย "อุปกรณ์เสริม" จากนั้นค้นหา "รูปภาพ" จากปุ่ม "รายละเอียด")
เริ่ม Delphi และเลือก "นำเข้า ActiveX Control" ใต้รายการเมนู "ส่วนประกอบ"
ในเวลานี้ คุณจะเห็นได้ว่ามี "การควบคุมการแก้ไขรูปภาพ Wang, การควบคุมการสแกนรูปภาพ Wang, Wang"
Image Management Control, Wang Image Thumbnail Control" เลือกสี่รายการเหล่านี้ จากนั้นคลิก "Install"
จากนั้นคุณจะเห็นไอคอนของส่วนประกอบทั้งสี่นี้ใต้ป้าย ActiveX บนแผงส่วนประกอบ
---- คุณสมบัติหลักของ ImgScan: FileType: ประเภทไฟล์ของรูปภาพ (องค์ประกอบนี้รองรับสาม
ชนิด: TIFF, BMP, AWD);
ScanTo: กลับหรือกำหนดวัตถุประสงค์ของภาพที่สแกน
ความหมายของค่าที่เป็นไปได้
0 (ค่าเริ่มต้น) แสดงภาพที่สแกน
1 แสดงภาพที่สแกนและเขียนลงในไฟล์
2 เขียนภาพลงในไฟล์
3 เขียนภาพลงในไฟล์ในโหมดเทมเพลตแล้วแสดง
4. เขียนภาพลงในไฟล์เป็นเทมเพลต
5 รูปภาพที่สแกนแฟกซ์
หมายเหตุ: หากคุณใช้ค่าเริ่มต้นเป็น 0
ต้องใช้ร่วมกับคอมโพเนนต์ Wang ImgEdit
DestImageControl: ชื่อส่วนประกอบ Wang ImgEdit;
ซูม: อัตราส่วนการซูมของภาพ
วิธีการหลักของ ImgScan: OpenScanner: เปิดสแกนเนอร์
CloseScanner: ปิดสแกนเนอร์
StartScan: เริ่มการสแกน;
StopScan: หยุดการสแกน
----คุณสมบัติของ ImgEdit ส่วนใหญ่จะควบคุมความละเอียดของภาพที่สแกน ความกว้าง และความสูงของภาพ ไม่ว่าจะเป็น
อนุญาตให้เลือกภาพบางส่วน ฯลฯ วิธีการหลัก ได้แก่ การคัดลอกและตัดภาพไปยังแผ่นแปะ
คัดลอกรูปภาพจากคลิปบอร์ด หมุน ปรับขนาด พิมพ์ภาพ บันทึก รีเฟรชรูปภาพ ฯลฯ
---- คำแนะนำโดยละเอียดสำหรับส่วนประกอบ OCX ทั้งสี่ข้างต้นสามารถดูได้ใน Delphi
ระบบช่วยเหลือ
---- นี่คือตัวอย่างบางส่วนของการใช้องค์ประกอบทั้งสองนี้:
ขั้นตอน Tscanf.N1Click (ผู้ส่ง: TObject);
เริ่ม
ImgScan1.ShowSelectScanner;
file://เลือกสแกนเนอร์ที่ติดตั้งในระบบ
จบ;
ขั้นตอน Tscanf.N2Click (ผู้ส่ง: TObject);
เริ่ม
imgedit1.zoom:=100; file://Set ปัจจัยการซูมของภาพ
ถ้าไม่ใช่ imgscan1.ScannerAvailable แล้ว
file:// หากไม่มีเครื่องสแกนที่เลือกไว้
imgscan1.OpenScanner;//เปิดสแกนเนอร์
imgscan1.StartScan; file://เริ่มสแกนภาพ
imgscan1.CloseScanner; file://ปิดสแกนเนอร์
จบ;
ขั้นตอน Tscanf.N8Click (ผู้ส่ง: TObject);
เริ่ม
ถ้า (imgedit1.IsClipboardDataAvailable
และ imgedit1.ImageDisplayed ) จากนั้น
imgedit1.ClipboardPaste(selleft,seltop);
file://paste รูปภาพจากคลิปบอร์ด พารามิเตอร์ของมันคือพิกัดเริ่มต้นของพื้นที่แสดงผลของ Imgedit
จบ;
ขั้นตอน Tscanf.N1801Click (ผู้ส่ง: TObject);
เริ่ม
ถ้า imgedit1.ImageDisplayed แล้ว
imgedit1.Flip; file://mirror image
จบ;
ขั้นตอน Tscanf.N901Click(Sender: TObject);
เริ่ม
ถ้า imgedit1.ImageDisplayed แล้ว
imgedit1.RotateRight file://หมุนภาพไปทางขวา
จบ;
ขั้นตอน Tscanf.N6Click (ผู้ส่ง: TObject);
เริ่ม
imgedit1.DrawSelectionRect(selleft,
seltop, selwidth, selheight); // ทำการเลือกรูปภาพบางส่วน
imgedit1.ClipboardCut(selleft,seltop,
selwidth,selheight);//ตัดพื้นที่ที่เลือก
จบ;
---- หมายเหตุ: เมื่อใช้ฟังก์ชันคัดลอกและตัดของส่วนประกอบ Imgedit ใน DELPHI จะมี
คำถามต่อไปนี้:
---- 1. หากคุณเลือกทั้งภาพก็จะไม่มีปัญหา
---- 2. หากเลือกพื้นที่ท้องถิ่น พื้นที่ที่คัดลอกและตัดจะลอยไป
---- 3. ถ้า DELPHI กำลังสร้างอินเทอร์เฟซไคลเอนต์ของฐานข้อมูล MS SQL back-end ดังนั้น
เมื่อเนื้อหารูปภาพถูกเขียนลงในฟิลด์รูปภาพของฐานข้อมูล BDE (กลไกฐานข้อมูล) จะรายงานข้อผิดพลาด นี่คือ
DELPHI3.0 และ 4.0 BUG, แพ็คเกจอัปเกรด 4.0 สามารถแก้ปัญหานี้ได้
---- ส่วนปัญหาที่สองก็แก้ได้ดังนี้: onSelectionRectDrawn ใน Imgedit
เขียนโค้ดในเหตุการณ์เพื่อบันทึกค่าขอบเขตของพื้นที่ที่เลือกเป็นตัวแปรร่วมสี่ตัวหลังจากการคัดลอก
เพียงใช้ตัวแปรที่บันทึกไว้ก่อนหน้านี้เพื่อทำการเลือกอื่นก่อนที่จะตัด (แน่นอนว่าทั้งหมดนี้จะเกิดขึ้นในภายหลัง)
ดูตัวอย่างก่อนหน้า)
---- สภาพแวดล้อมการพัฒนา: DELPHI4.0, สแกนเนอร์ HP ScanJet 4P;
----แนบซอร์สโค้ดแล้ว
หน่วยสแกน;
อินเตอร์เฟซ
การใช้งาน
Windows, ข้อความ, SysUtils, คลาส, กราฟิก, การควบคุม,
แบบฟอร์ม, กล่องโต้ตอบ, เมนู, ScanLib_TLB, ExtCtrls, AxCtrls,
OleCtrls, ImgeditLib_TLB;
พิมพ์
Tscanf = คลาส (TForm)
เมนูหลัก1: TMainMenu;
F1: TMenuItem;
N15: TMenuItem;
N1: TMenuItem;
N2: TMenuItem;
N16: TMenuItem;
N11: TMenuItem;
N5: TMenuItem;
C1: TMenuItem;
N4: TMenuItem;
E1: TMenuItem;
N6: TMenuItem;
N7: TMenuItem;
N8: TMenuItem;
N3: TMenuItem;
N10: TMenuItem;
N9: TMenuItem;
N1801: TMenuItem;
N901: TMenuItem;
N902: TMenuItem;
H1: TMenuItem;
N12: TMenuItem;
N13: TMenuItem;
ImgEdit1: TImgEdit;
เบเวล1: ทีเบล;
ImgScan1: TImgScan;
Bevel2: TBevel;
ขั้นตอน N4Click (ผู้ส่ง: TObject);
ขั้นตอน N1Click (ผู้ส่ง: TObject);
ขั้นตอน N2Click (ผู้ส่ง: TObject);
ขั้นตอน C1Click (ผู้ส่ง: TObject);
ขั้นตอน N8Click (ผู้ส่ง: TObject);
ขั้นตอน N1801คลิก (ผู้ส่ง: TObject);
ขั้นตอน N901Click (ผู้ส่ง: TObject);
ขั้นตอน N902Click (ผู้ส่ง: TObject);
ขั้นตอน N6Click (ผู้ส่ง: TObject);
ขั้นตอน N7Click (ผู้ส่ง: TObject);
ขั้นตอน ImgEdit1SelectionRectDrawn (ผู้ส่ง: TObject; ซ้าย, บน,
ความกว้าง ความสูง: จำนวนเต็ม);
ขั้นตอน N11Click (ผู้ส่ง: TObject);
ส่วนตัว
{ประกาศส่วนตัว}
สาธารณะ
selleft,seltop,selwidth,selheight:จำนวนเต็ม;
{ประกาศสาธารณะ}
จบ;
var
scanf: Tscanf;
การดำเนินการ
{$R *.DFM}
ขั้นตอน Tscanf.N4Click (ผู้ส่ง: TObject);
เริ่ม
imgedit1.ClearDisplay;
ปิด;
จบ;
ขั้นตอน Tscanf.N1Click (ผู้ส่ง: TObject);
เริ่ม
ImgScan1.ShowSelectScanner;
จบ;
ขั้นตอน Tscanf.N2Click (ผู้ส่ง: TObject);
เริ่ม
imgedit1.zoom:=100;
ถ้าไม่ใช่ imgscan1.ScannerAvailable แล้ว
imgscan1.OpenScanner;
imgscan1.StartScan;
imgscan1.CloseScanner;
จบ;
ขั้นตอน Tscanf.C1Click (ผู้ส่ง: TObject);
เริ่ม
ถ้า imgedit1.ImageDisplayed แล้ว
เริ่ม
imgedit1.ClearDisplay;
imgedit1.zoom:=100;
จบ;
จบ;
ขั้นตอน Tscanf.N8Click (ผู้ส่ง: TObject);
เริ่ม
ถ้า (imgedit1.IsClipboardDataAvailable และ imgedit1.ImageDisplayed )
แล้ว
imgedit1.ClipboardPaste(selleft,seltop);
จบ;
ขั้นตอน Tscanf.N1801Click (ผู้ส่ง: TObject);
เริ่ม
ถ้า imgedit1.ImageDisplayed แล้ว
imgedit1.พลิก;
จบ;
ขั้นตอน Tscanf.N901Click(Sender: TObject);
เริ่ม
ถ้า imgedit1.ImageDisplayed แล้ว
imgedit1.หมุนขวา
จบ;
ขั้นตอน Tscanf.N902Click (ผู้ส่ง: TObject);
เริ่ม
ถ้า imgedit1.ImageDisplayed แล้ว
imgedit1.หมุนซ้าย;
จบ;
ขั้นตอน Tscanf.N6Click (ผู้ส่ง: TObject);
เริ่ม
imgedit1.DrawSelectionRect(selleft,seltop,selwidth,selheight);
imgedit1.ClipboardCut(selleft,seltop,selwidth,selheight);
จบ;
ขั้นตอน Tscanf.N7Click (ผู้ส่ง: TObject);
เริ่ม
imgedit1.DrawSelectionRect(selleft,seltop,selwidth,selheight);
imgedit1.ClipboardCopy(selleft,seltop,selwidth,selheight);
จบ;
ขั้นตอน Tscanf.ImgEdit1SelectionRectDrawn (ผู้ส่ง: TObject; ซ้าย,
ด้านบน ความกว้าง ความสูง: จำนวนเต็ม);
เริ่ม
ถ้า ((ความกว้าง=0) และ (ความสูง=0))แล้ว
เริ่ม
n3.เปิดใช้งาน:=false;
n6.เปิดใช้งาน:=false;
n7.เปิดใช้งาน:=false;
ขายซ้าย:=ซ้าย;
เซลท็อป:=บน;
ความกว้าง:=ความกว้าง;
selheight:=ความสูง;
จบ
เริ่มอย่างอื่น
n6.เปิดใช้งาน:=true;
n7.เปิดใช้งาน:=true;
ขายซ้าย:=ซ้าย;
เซลท็อป:=บน;
ความกว้าง:=ความกว้าง;
selheight:=ความสูง;
จบ;
จบ;
ขั้นตอน Tscanf.N11Click (ผู้ส่ง: TObject);
เริ่ม
ถ้าไม่ใช่ imgedit1.IsClipboardDataAvailable แล้ว
ถ้า imgedit1.imagedisplayed แล้ว
imgedit1.ClipboardCopy(0,0,imgedit1.Width,imgedit1.Height);
จบ;
จบ