[DELPHI]Delphi でスキャナーを制御する
---- Delphiを使って情報管理システムを開発する場合、画像を加工することが多くなりますが、これも情報管理システムの開発では避けられない傾向です。 Delphi のスキャナーを介して必要な画像情報を取得するにはどうすればよいですか?基本的な方法は 3 つ以下です。
Photoshop などの画像処理ソフトウェアを使用すると、画像をスキャンする機能により、特定の形式の画像に処理して、独自のシステムで使用することができます。
スキャナ インターフェイス Twain.DLL 経由。このインターフェースは、スキャナーのインストール時に提供され、実際には一連の機能を通じてスキャナーを制御するプラグインです。
コンポーネント技術を通じてスキャナーを制御します。
---- 最初の方法を使用すると、プログラミングの複雑さを軽減できますが、システムの統合性が高くなく、ユーザーが使用するのが不便です。2 番目の方法は、ドライバー レベルでスキャナを直接制御できるため、
プログラミングに最大限の柔軟性と制御性を提供します。3 番目の方法では、Delphi のビジュアル コンポーネント テクノロジを最大限に活用して、スキャナを安全、柔軟、自由に使用できます。実際、3 番目の方法も、
これは、スキャナ インターフェイス Twain.DLL の上に構築されています。この記事で説明する方法は 3 番目の方法を採用しています。
---- Windows9X には、添付ファイルに「イメージ」オプションがあり、OCX コンポーネントを使用してスキャナを制御します。imgEdit、imgAnntool、imgScan、imgAdmin の 4 つのコンポーネントで、基本的にスキャナを完全に制御できます。 Delphi での使用方法は次のとおりです。 Windows9x ではインストール「イメージ」を選択します。 (コントロール パネルの [プログラムの追加と削除] を選択し、[Windows のインストール] を選択し、[アクセサリ] チェック ボックスをクリックして、[詳細] ボタンから [イメージ] を見つけます)
Delphi を起動し、「コンポーネント」メニュー項目の下にある「ActiveX コントロールのインポート」を選択します。
この時点で、「Wang Image Editing Control、Wang Image Scanning Control、Wang」があることがわかります。
Image Management Control、Wang Image Thumbnail Control」の4項目を選択し、「インストール」をクリックします。
ボタンをクリックすると、コンポーネント パネルの ActiveX ラベルの下にこれら 4 つのコンポーネントのアイコンが表示されます。
---- ImgScan の主な属性: FileType: 画像のファイル タイプ (このコンポーネントは 3 つのファイル タイプをサポートします)
種: TIFF、BMP、AWD);
ScanTo: スキャンされた画像の目的を返すか設定します。
考えられる値の意味
0 (デフォルト) スキャンした画像を表示します。
1 スキャンした画像を表示し、ファイルに書き込みます。
2 画像をファイルに書き込む
3 テンプレートモードで画像をファイルに書き込み、表示します。
4. 画像をテンプレートとしてファイルに書き込みます
5 スキャンした画像をファクスします
注: デフォルト値 0 を使用すると、
Wang ImgEdit コンポーネントと組み合わせて使用する必要があります。
DestImageControl: Wang ImgEdit コンポーネント名。
ズーム: 画像のズーム率
ImgScan の主なメソッド: OpenScanner: スキャナーを開きます。
CloseScanner: スキャナを閉じます。
StartScan: スキャンを開始します。
StopScan: スキャンを停止します
----ImgEdit のプロパティは主に、スキャンされた画像の解像度、画像の幅と高さ、
画像の部分選択などを可能にします。主な方法としては、画像をペーストボードにコピーしたり切り取ったりする方法があります。
クリップボードからの画像のコピー、画像の回転、拡大縮小、ミラーリング、画像の印刷、保存、更新など。
---- 上記 4 つの OCX コンポーネントの詳細な手順は、Delphi で参照できます。
ヘルプシステム。
---- これら 2 つのコンポーネントの使用例をいくつか示します。
手順 Tscanf.N1Click(送信者: TObject);
始める
ImgScan1.ShowSelectScanner;
file://システムにインストールされているスキャナを選択します
終わり;
プロシージャ Tscanf.N2Click(送信者: TObject);
始める
imgedit1.zoom:=100; file://画像のズーム率を設定します
imgscan1.ScannerAvailable でない場合は、
file:// 選択したスキャナーが利用できない場合
imgscan1.OpenScanner;//スキャナを開きます
imgscan1.StartScan file://画像のスキャンを開始します。
imgscan1.CloseScanner file://スキャナーを閉じる
終わり;
プロシージャ 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 file://画像を右に回転します
終わり;
プロシージャ 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 のバグ、4.0 アップグレード パッケージはこの問題を解決できます。
---- 2 番目の問題については、次のように解決できます。 Imgedit の onSelectionRectDrawn
コピー後に、選択した領域の境界値を 4 つのグローバル変数に保存するコードをイベントに記述します。
カットする前に、以前に保存した変数を使用して別の選択を行うだけです (もちろん、これはすべて後で行われます)。
ステージ、前の例を参照)。
---- 開発環境: DELPHI4.0、HP ScanJet 4P スキャナー。
----ソースコードを添付します。
ユニットスキャヌ。
インタフェース
用途
ウィンドウ、メッセージ、SysUtils、クラス、グラフィックス、コントロール、
フォーム、ダイアログ、メニュー、ScanLib_TLB、ExtCtrls、AxCtrls、
OleCtrls、ImgeditLib_TLB;
タイプ
Tscanf = クラス(TForm)
MainMenu1: 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: Tベベル;
ImgScan1: TImgScan;
ベベル2: Tベベル;
プロシージャ N4Click(送信者: TObject);
プロシージャ N1Click(送信者: TObject);
プロシージャ N2Click(送信者: TObject);
プロシージャ C1Click(送信者: TObject);
プロシージャ N8Click(送信者: TObject);
プロシージャ N1801Click(送信者: TObject);
プロシージャ N901Click(送信者: TObject);
プロシージャ N902Click(送信者: TObject);
プロシージャ N6Click(送信者: TObject);
プロシージャ N7Click(送信者: TObject);
プロシージャ ImgEdit1SelectionRectDrawn(Sender: TObject; Left,Top,
幅、高さ: 整数);
プロシージャ N11Click(送信者: TObject);
プライベート
{プライベート宣言}
公共
selleft、seltop、selwidth、selheight:整数;
{公的宣言}
終わり;
変数
scanf: スキャンフ;
実装
{$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);
始める
if (imgedit1.IsClipboardDataAvailable および imgedit1.ImageDisplayed )
それから
imgedit1.ClipboardPaste(selleft,seltop);
終わり;
プロシージャ Tscanf.N1801Click(送信者: TObject);
始める
imgedit1.ImageDisplayed の場合、
imgedit1.フリップ;
終わり;
プロシージャ Tscanf.N901Click(送信者: TObject);
始める
imgedit1.ImageDisplayed の場合、
imgedit1.RotateRight
終わり;
プロシージャ Tscanf.N902Click(送信者: TObject);
始める
imgedit1.ImageDisplayed の場合、
imgedit1.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(Sender: TObject; Left,
上、幅、高さ: 整数);
始める
if ((幅=0) および (高さ=0))
始める
n3.有効:=false;
n6.有効:=false;
n7.有効:=false;
売る左:=左;
セルトップ:=トップ;
selwidth:=幅;
セル高さ:= 高さ;
終わり
そうでなければ始まる
n6.有効:= true;
n7.有効:= true;
売る左:=左;
セルトップ:=トップ;
selwidth:=幅;
セル高さ:= 高さ;
終わり;
終わり;
プロシージャ Tscanf.N11Click(送信者: TObject);
始める
imgedit1.IsClipboardDataAvailable でない場合は、
imgedit1.imagedisplay の場合
imgedit1.ClipboardCopy(0,0,imgedit1.Width,imgedit1.Height);
終わり;
終わり