[DELPHI]델파이의 제어 스캐너
---- 델파이를 이용하여 정보관리 시스템을 개발할 때, 이미지를 처리하는 경우가 많은데, 이는 정보관리 시스템 개발에 있어서 피할 수 없는 추세이기도 합니다. Delphi에서 스캐너를 통해 필요한 이미지 정보를 얻는 방법은 무엇입니까? 세 가지 이상의 기본 방법이 없습니다.
포토샵 등과 같은 이미지 처리 소프트웨어를 통해 이미지 스캔 기능을 통해 특정 형식의 이미지로 처리한 후 자체 시스템에서 사용할 수 있습니다.
스캐너 인터페이스 Twain.DLL을 통해. 이 인터페이스는 스캐너를 설치할 때 제공되며 실제로는 일련의 기능을 통해 스캐너를 제어하는 플러그인입니다.
컴포넌트 기술을 통해 스캐너를 제어합니다.
---- 첫 번째 방법을 사용하면 프로그래밍의 복잡성을 줄일 수 있지만 시스템 통합도가 높지 않고 사용자가 사용하기 불편합니다. 두 번째 방법은 드라이버 수준에서 스캐너를 직접 제어할 수 있습니다.
프로그래밍 시 최대한의 유연성과 제어 가능성을 제공합니다. 세 번째 방법은 Delphi의 시각적 구성 요소 기술을 최대한 활용하여 스캐너를 안전하고 유연하며 자유롭게 사용할 수 있습니다. 사실 세번째 방법도
이는 스캐너 인터페이스 Twain.DLL 위에 구축되었습니다. 이 글에서 논의되는 방법은 세 번째 방법을 채택한다.
---- Windows9X는 스캐너를 제어하기 위해 OCX 구성 요소를 사용하는 "이미지" 옵션을 제공합니다. imgEdit, imgAnntool, imgScan 및 imgAdmin 이 네 가지 구성 요소는 기본적으로 스캐너를 완전히 제어합니다. Delphi에서의 사용법은 다음과 같습니다. Windows9x에서 설치 "이미지"를 선택합니다. (제어판에서 "프로그램 추가/제거"를 선택한 다음 "Windows 설치"를 선택하고 "보조프로그램" 확인란을 클릭한 다음 "세부 정보" 버튼에서 "이미지"를 찾습니다.)
Delphi를 시작하고 "Component" 메뉴 항목에서 "ActiveX 컨트롤 가져오기"를 선택합니다.
이때 "Wang 이미지 편집 컨트롤, Wang 이미지 스캐닝 컨트롤, Wang"이 있음을 알 수 있습니다.
이미지 관리 제어, Wang 이미지 썸네일 제어"에서 이 4개 항목을 선택한 후 "설치"를 클릭하세요.
버튼을 클릭하면 구성 요소 패널의 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에서 볼 수 있습니다.
도움말 시스템.
---- 다음은 이 두 구성 요소를 사용하는 몇 가지 예입니다.
PROcedure Tscanf.N1Click(보내는 사람: TObject);
시작하다
ImgScan1.ShowSelectScanner;
file://시스템에 설치된 스캐너를 선택하세요.
끝;
절차 Tscanf.N2Click(보내는 사람: TObject);
시작하다
imgedit1.zoom:=100; file://이미지의 확대/축소 비율 설정
imgscan1.ScannerAvailable이 아닌 경우
file://선택한 스캐너를 사용할 수 없는 경우
imgscan1.OpenScanner;//스캐너 열기
imgscan1.StartScan file://이미지 스캔 시작
imgscan1.CloseScanner;파일://스캐너 닫기
끝;
절차 Tscanf.N8Click(보내는 사람: TObject);
시작하다
if(imgedit1.IsClipboardDataAvailable
및 imgedit1.ImageDisplayed ) 그런 다음
imgedit1.ClipboardPaste(selleft,seltop);
file://클립보드의 이미지를 붙여넣습니다. 해당 매개변수는 Imgedit 표시 영역의 시작 좌표입니다.
끝;
절차 Tscanf.N1801Click(보내는 사람: TObject);
시작하다
imgedit1.ImageDisplayed인 경우
imgedit1.Flip;파일://거울 이미지
끝;
절차 Tscanf.N901Click(보내는 사람: TObject);
시작하다
imgedit1.ImageDisplayed인 경우
imgedit1.RotateRight 파일://이미지를 오른쪽으로 회전
끝;
절차 Tscanf.N6Click(보내는 사람: TObject);
시작하다
imgedit1.DrawSelectionRect(selleft,
seltop, selwidth, selheight) // 이미지의 부분 선택을 수행합니다.
imgedit1.ClipboardCut(selleft,seltop,
selwidth,selheight);//선택한 영역을 잘라냅니다.
끝;
---- 참고: DELPHI에서 Imgedit 구성 요소의 복사 및 잘라내기 기능을 사용할 때
다음 질문:
---- 1. 전체 이미지를 선택하시면 문제가 없습니다.
---- 2. 로컬 영역을 선택하면 복사 및 잘라낸 영역이 떠다닙니다.
---- 3. DELPHI가 MS SQL 백엔드 데이터베이스의 클라이언트 인터페이스를 만드는 경우
이미지 내용이 데이터베이스의 이미지 필드에 기록되면 BDE(데이터베이스 엔진)가 오류를 보고합니다. 이것은
DELPHI3.0 및 4.0 BUG, 4.0 업그레이드 패키지는 이 문제를 해결할 수 있습니다.
---- 두 번째 문제는 다음과 같이 해결할 수 있습니다. Imgedit의 onSelectionRectDrawn
복사한 후 선택한 영역의 경계값을 4개의 전역변수에 저장하는 이벤트 코드를 작성합니다.
자르기 전에 이전에 저장한 변수를 사용하여 다른 항목을 선택하면 됩니다(물론 이 모든 작업은 나중에 발생합니다).
단계, 이전 예 참조).
---- 개발 환경: DELPHI4.0, HP ScanJet 4P 스캐너;
---- 소스코드 첨부.
단위 스캔;
인터페이스
용도
Windows, 메시지, SysUtils, 클래스, 그래픽, 컨트롤,
양식, 대화 상자, 메뉴, ScanLib_TLB, ExtCtrls, AxCtrls,
OleCtrls, ImgeditLib_TLB;
유형
Tscanf = 클래스(TForm)
메인메뉴1: TMainMenu;
F1: TMenu항목;
N15: TMenu항목;
N1: TMenuItem;
N2: TMenuItem;
N16: TMenu항목;
N11: TMenu항목;
N5: TMenu항목;
C1: TMenuItem;
N4: TMenuItem;
E1: TMenu항목;
N6: TMenu항목;
N7: TMenu항목;
N8: TMenu항목;
N3: TMenuItem;
N10: TMenu항목;
N9: TMenuItem;
N1801: TMenuItem;
N901: TMenuItem;
N902: TMenuItem;
H1: TMenuItem;
N12: TMenu항목;
N13: TMenuItem;
ImgEdit1: TImgEdit;
베벨1: T베벨;
ImgScan1: TImgScan;
베벨2: T베벨;
절차 N4Click(보내는 사람: TObject);
절차 N1Click(보내는 사람: TObject);
절차 N2Click(보내는 사람: TObject);
절차 C1Click(보내는 사람: TObject);
절차 N8Click(보내는 사람: TObject);
절차 N1801Click(보내는 사람: TObject);
절차 N901Click(Sender: TObject);
절차 N902Click(보내는 사람: TObject);
절차 N6Click(보내는 사람: TObject);
절차 N7Click(보내는 사람: TObject);
절차 ImgEdit1SelectionRectDrawn(보내기: TObject; 왼쪽, 위쪽,
너비, 높이: 정수);
절차 N11Click(보내는 사람: TObject);
사적인
{비공개 선언}
공공의
Selleft,seltop,selwidth,selheight:integer;
{공개 선언}
끝;
var
scanf: Tscanf;
구현
{$R *.DFM}
절차 Tscanf.N4Click(보내는 사람: TObject);
시작하다
imgeedit1.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인 경우
시작하다
imgeedit1.ClearDisplay;
imgedit1.zoom:=100;
끝;
끝;
절차 Tscanf.N8Click(보내는 사람: TObject);
시작하다
if(imgedit1.IsClipboardDataAvailable 및 imgedit1.ImageDisplayed)
그 다음에
imgedit1.ClipboardPaste(selleft,seltop);
끝;
절차 Tscanf.N1801Click(보내는 사람: TObject);
시작하다
imgedit1.ImageDisplayed인 경우
imgeedit1.Flip;
끝;
절차 Tscanf.N901Click(보내는 사람: TObject);
시작하다
imgedit1.ImageDisplayed인 경우
imgeedit1.RotateRight
끝;
절차 Tscanf.N902Click(보내는 사람: TObject);
시작하다
imgedit1.ImageDisplayed인 경우
imgeedit1.RotateLeft;
끝;
절차 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; 왼쪽,
상단, 너비, 높이: 정수);
시작하다
if ((너비=0) 및 (높이=0))then
시작하다
n3.활성화:=false;
n6.활성화:=false;
n7.활성화:=false;
Sellleft:=왼쪽;
Seltop:=상단;
셀폭:=너비;
셀높이:=높이;
끝
그렇지 않으면 시작하다
n6.활성화:=true;
n7.활성화:=true;
Sellleft:=왼쪽;
Seltop:=상단;
셀폭:=너비;
셀높이:=높이;
끝;
끝;
절차 Tscanf.N11Click(보내는 사람: TObject);
시작하다
imgeedit1.IsClipboardDataAvailable이 아닌 경우
imgedit1.image가 표시되면
imgedit1.ClipboardCopy(0,0,imgedit1.Width,imgedit1.Height);
끝;
끝