none
WIAドライバーでキヤノン製スキャナーの最大読み取り範囲を取得するには RRS feed

  • 質問

  • Visual Studio 2010のC#にてWIAドライバーを使った、スキャナー機器の読み取りプログラムを作成しています。

    以下はそのプログラム例なのですが、キヤノン製のスキャナーでは実際より小さいサイズが返されるため、50dpiによるプレビュー画像のスキャンが正しく行われません。メーカーに問い合わせたところ、「WIA_IPS_XEXTENTとWIA_IPS_YEXTENTの値を取得してください」との回答があったのですが、エプソン製スキャナーではこのIDが見当たりません。これらの機器に柔軟に対応できるようには、どのようにプログラムを組めば良いかをお教えください。

    using System;
    using System.Collections.Generic;
    using System.Text;
    using WIA;
    
    namespace ScanTest
    {
    	class Program
    	{
    		private static void SetProperty(WIA.Item item, bool grayscale, int dpi)
    		{
    			const int WIA_DATA_GRAYSCALE = 2;
    			const int WIA_DATA_COLOR = 3;
    			const int WIA_IPA_DATATYPE = 4103;
    			foreach (WIA.Property p in item.Properties) {
    				if (p.IsReadOnly == false) {
    					switch (p.PropertyID) {
    					case WIA_IPA_DATATYPE: p.set_Value(grayscale ? WIA_DATA_GRAYSCALE : WIA_DATA_COLOR); break;
    					case 6147:	// Horizontal Resolution, Vertical Resolution
    					case 6148: p.set_Value(dpi); break;
    					}
    				}
    				string prop = string.Format("{3}{0}({1}) : {2}", p.Name, p.PropertyID, p.get_Value(), p.IsReadOnly ? "*" : "");
    				Console.WriteLine(prop);
    			}
    			Console.WriteLine();
    		}
    
    		static void Main(string[] args)
    		{
    			DeviceManager dmc = new DeviceManager();
    			DeviceInfos devs = dmc.DeviceInfos;
    
    			// 一番始めに見つかったスキャナデバイスを対象にする
    			DeviceInfo device_info = null;
    			foreach (DeviceInfo i in devs) {
    				if (i.Type == WiaDeviceType.ScannerDeviceType) {
    					device_info = i;
    					break;
    				}
    			}
    			if (device_info == null) return;
    
    			Device device = device_info.Connect();
    
    			WIA.CommonDialog dlg = new WIA.CommonDialog();
    			WIA.Item item = device.Items[1];
    
    			// フルカラーの50dpiに変更
    			SetProperty(item, false, 50);
    
    			// スキャンできるサイズを取得
    			foreach (WIA.Property p in item.Properties) {
    				if (p.PropertyID == 6151) {	// Horizontal Extent
    					Console.WriteLine("Width : {0}", p.get_Value());
    				} else if (p.PropertyID == 6152) {	// Vertical Extent
    					Console.WriteLine("Height : {0}", p.get_Value());
    				}
    			}
    
    			// キヤノン社のMP640では「Width : 141, Height : 194」が返る
    			// エプソン社のPX-A640では「Width : 425, Height : 585」が返る
    			Console.ReadLine();
    		}
    	}
    }
    
    

    2011年3月16日 12:10

すべての返信

  • WIA のデータはプロパティセットなので、あったら使うとすればいいのではないでしょうか?WIA_IPS_XEXTENT(YEXTENT)があればそれを使い、なければ従来のものを利用する。とすれば、互換性を確保しつつ、EXTENTも使うことができると思います。


    わんくま同盟,Microsoft MVP for Visual C++(Oct 2005-) http://blogs.wankuma.com/tocchann/
    2011年3月16日 12:35
  • キヤノン製複合機・MP640でのログを見たのですが、WIA_IPS_XEXTENTに該当するプロパティはありませんでした。キヤノン製品をお持ちの方がおられましたら、上記のプログラムでどのようなログが出力されるかをお教えください。
    2011年3月17日 2:06