1. はじめに
TwainDotNetを使用してC#のWinFormからTWAINでスキャンしました。
2. 画面
「SelectSource」でスキャナを選択します。
「Scan」でTWAINドライバのダイアログを表示してスキャンします。
3. TwainDotNetの準備
TwainDotNetはnugetで取得できます。
nugetする前にx86でビルドするように変更しないと、警告が表示されます。nugetした後に変更しても大丈夫です。
4. ソース
usingSystem;usingSystem.Drawing;usingSystem.Drawing.Imaging;usingSystem.IO;usingSystem.Windows.Forms;usingTwainDotNet;usingTwainDotNet.WinFroms;namespaceTwainDotNetTest1{publicpartialclassForm1:Form{privateconststringSCAN_DIR=@"C:\scan";privateTwaintwain=null;privateScanSettingssettings=null;privateBitmapresultImage=null;privateintscanCount=1;publicForm1(){InitializeComponent();}privatevoidForm1_Load(objectsender,EventArgse){twain=newTwain(newWinFormsWindowMessageHook(this));twain.TransferImage+=twain_TransferImage;twain.ScanningComplete+=twain_ScanningComplete;settings=newScanSettings();settings.ShowTwainUI=true;}privatevoidbtnSelectSource_Click(objectsender,EventArgse){twain.SelectSource();}privatevoidbtnScan_Click(objectsender,EventArgse){try{twain.StartScanning(settings);}catch(Exceptionex){}}privatevoidtwain_TransferImage(objectsender,TransferImageEventArgse){resultImage=e.Image;stringfilename=String.Format("{0:D6}",scanCount)+".png";stringfullname=Path.Combine(SCAN_DIR,filename);resultImage.Save(fullname,ImageFormat.Png);scanCount++;}privatevoidtwain_ScanningComplete(objectsender,ScanningCompleteEventArgse){}}}5. 解説
WinForm用のTwainオブジェクトを作成し、イベントハンドラをセットします。WPF用もあります。
twain=newTwain(newWinFormsWindowMessageHook(this));twain.TransferImage+=twain_TransferImage;twain.ScanningComplete+=twain_ScanningComplete;後述のStartScanning()に渡すScanSettingsオブジェクトを作成します。StartScanning()のタイミングでTWAINドライバのダイアログを表示するためにShowTwainUIにtrueを代入します。
settings=newScanSettings();settings.ShowTwainUI=true;ソース選択ダイアログを表示します。
twain.SelectSource();スキャンを開始します。ShowTwainUIをtrueにしているため、TWAINドライバのダイアログが表示され、スキャンを開始するボタンを押下するとスキャンが開始されます。ShowTwainUIがfalseのままだと、TWAINドライバのダイアログが表示されずにスキャンが開始されます。
他のアプリケーションでTWAINドライバが使用中の場合には、TWAINドライバがエラーダイアログを表示して(TWAINドライバの実装に依存する)、ダイアログを閉じた後に例外が発生します。例外をcatchして握りつぶしています。
try{twain.StartScanning(settings);}catch(Exceptionex){}
TWAINドライバのダイアログ(Canon DR-G1130)
1画像転送される毎にTransferImageが発生します。ADFスキャナの場合には1画像毎に連続して呼ばれます。ここでは0パディング6桁連番でPNGファイルとして保存しています。無条件上書きなので注意して下さい。
privatevoidtwain_TransferImage(objectsender,TransferImageEventArgse){resultImage=e.Image;stringfilename=String.Format("{0:D6}",scanCount)+".png";stringfullname=Path.Combine(SCAN_DIR,filename);resultImage.Save(fullname,ImageFormat.Png);scanCount++;}スキャン完了時にScanningCompleteが発生します。ADFスキャナの場合には、連続したスキャンが完了した時に1回呼ばれます。また、TWAINドライバのダイアログを閉じたときにも呼ばれます。
privatevoidtwain_ScanningComplete(objectsender,ScanningCompleteEventArgse){}
