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();
}
}
}